import java.io.*; |
import java.net.*; |
import java.util.*; |
public class ChatServer { |
boolean started = false ; |
ServerSocket ss = null ; |
List<Client> clients = new ArrayList<Client>(); |
public static void main(String[] args) { |
System.out.println( "aa\n" ); |
new ChatServer().start(); |
} |
//程序运行就执行下面的程序段 |
public void start() { |
try { |
started = true ; |
ss = new ServerSocket( 8888 ); //开发一个8888端口的Socket通道 |
System.out.println( "aa\n" ); |
} catch (BindException e) { //出现连接错误的时候关闭到,说明已有相同的服务在运行 |
System.out.println( "端口使用中...." ); |
System.out.println( "请关掉相关程序并重新运行服务器!" ); |
System.exit( 0 ); |
} catch (IOException e) { |
e.printStackTrace(); |
} |
try { |
//当你开启后会在这个程序内循环 |
while (started) { |
Socket s = ss.accept(); //等待用户的连接 |
Client c = new Client(s); //当有用户连接的时候创建一个Client客户 |
System.out.println( "a client connected!" ); |
new Thread(c).start(); |
clients.add(c); |
//dis.close(); |
} |
} catch (IOException e) { |
e.printStackTrace(); |
} finally { |
try { |
ss.close(); |
} catch (IOException e) { |
// TODO Auto-generated catch block |
e.printStackTrace(); |
} |
} |
} |
//这个类主要是用于接收和用户的短信信息 |
class Client implements Runnable { |
private Socket s; |
private DataInputStream dis = null ; |
private DataOutputStream dos = null ; |
private boolean bConnected = false ; |
public Client(Socket s) { |
this .s = s; |
try { |
dis = new DataInputStream(s.getInputStream()); |
dos = new DataOutputStream(s.getOutputStream()); |
bConnected = true ; |
} catch (IOException e) { |
e.printStackTrace(); |
} |
} |
public void send(String str) { |
try { |
dos.writeUTF(str); |
} catch (IOException e) { |
e.printStackTrace(); |
} |
} |
public void run() { |
try { |
while (bConnected) { |
String str = dis.readUTF(); |
System.out.println(str); |
for ( int i = 0 ; i < clients.size(); i++) { |
Client c = clients.get(i); |
c.send(str); |
//System.out.println(" a string send !"); |
} |
/* |
for(Iterator<Client> it = clients.iterator(); it.hasNext(); ) { |
Client c = it.next(); |
c.send(str); |
} |
*/ |
/* |
Iterator<Client> it = clients.iterator(); |
while(it.hasNext()) { |
Client c = it.next(); |
c.send(str); |
} |
*/ |
} |
} catch (EOFException e) { |
System.out.println( "Client closed!" ); |
} catch (IOException e) { |
e.printStackTrace(); |
} finally { |
try { |
if (dis != null ) dis.close(); |
if (dos != null ) dos.close(); |
if (s != null ) { |
s.close(); |
//s = null; |
} |
} catch (IOException e1) { |
e1.printStackTrace(); |
} |
} |
} |
} |
} |
下面的是客户端的源代码 |
import java.awt.*; |
import java.awt.event.*; |
import java.io.*; |
import java.net.*; |
public class ChatClient extends Frame { |
Socket s = null ; |
DataOutputStream dos = null ; |
DataInputStream dis = null ; |
private boolean bConnected = false ; |
TextField tfTxt = new TextField(); |
TextArea taContent = new TextArea(); |
Thread tRecv = new Thread( new RecvThread()); |
public static void main(String[] args) { |
new ChatClient().launchFrame(); |
} |
public void launchFrame() { |
setLocation( 400 , 300 ); |
this .setSize( 300 , 300 ); |
add(tfTxt, BorderLayout.SOUTH); |
add(taContent, BorderLayout.NORTH); |
pack(); |
setVisible( true ); |
connect(); |
addWindowListener( new WindowAdapter() |
{ |
public void windowClosing(WindowEvent e) |
{ |
disconnect(); |
System.exit( 0 ); |
} |
}); |
tfTxt.addActionListener( new TFListener()); |
new Thread( new RecvThread()).start(); |
} |
public void connect() { |
try { |
s = new Socket( "127.0.0.1" , 8888 ); |
dos = new DataOutputStream(s.getOutputStream()); |
dis = new DataInputStream(s.getInputStream()); |
bConnected = true ; |
} catch (UnknownHostException e) { |
e.printStackTrace(); |
} catch (IOException e) { |
e.printStackTrace(); |
} |
} |
public void disconnect() { |
try { |
bConnected = false ; |
tRecv.join(); |
} catch (InterruptedException e2) { |
e2.printStackTrace(); |
} |
finally { |
try { |
dos.close(); |
s.close(); |
dis.close(); |
} catch (IOException e) { |
e.printStackTrace(); |
} |
; |
} |
} |
private class TFListener implements ActionListener { |
public void actionPerformed(ActionEvent e) { |
String str = tfTxt.getText().trim(); |
//taContent.setText(str); |
tfTxt.setText( "" ); |
try { |
dos.writeUTF(str); |
dos.flush(); |
} catch (IOException e1) { |
e1.printStackTrace(); |
} |
} |
} |
private class RecvThread implements Runnable { |
public void run() { |
try { |
while (bConnected) { |
String str = dis.readUTF(); |
//System.out.println(str); |
taContent.setText(taContent.getText() + str + '\n' ); |
} |
} catch (SocketException e) { |
System.out.println( "退出了,bye!" ); |
} catch (IOException e) { |
e.printStackTrace(); |
} |
} |
} |
} |
初级程序员
by: 嶙峋 发表于:2016-07-04 15:06:11 顶(0) | 踩(0) 回复
很好
回复评论