【www.bbyears.com--php基础】
最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人。
目录结构:
ChatClient:
代码如下
packagecom.panda.chat;
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjava.net.*;
@SuppressWarnings("serial")
publicclassChatClientextendsFrame {
privateTextArea ta =newTextArea();
privateTextField tf =newTextField();
privateDataOutputStream dos =null;
privateDataInputStream dis =null;
privateSocket socket =null;
privatebooleanbConnected =false;
privateThread thread=null;
publicstaticvoidmain(String[] args) {
newChatClient().frameClient();
}
publicvoidframeClient(){
setSize(400,400);
setLocation(400,300);
add(ta,BorderLayout.NORTH);
add(tf,BorderLayout.SOUTH);
pack();
tf.addActionListener(newTfListener());
//关闭窗口事件监听
this.addWindowListener(newWindowAdapter() {
@Override
publicvoidwindowClosing(WindowEvent e) {
disconnected();
System.exit(0);
}
});
this.connect();
setVisible(true);
}
//链接服务器地址
privatevoidconnect(){
try{
socket =newSocket("127.0.0.1",8888);
thread=newThread(newChatThread());
thread.start();
dos =newDataOutputStream(socket.getOutputStream());
dis =newDataInputStream(socket.getInputStream());
}catch(UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//断开连接
privatevoiddisconnected(){
bConnected =false;
try{
dos.close();
dis.close();
socket.close();
}catch(IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
//键盘回车事件
privateclassTfListenerimplementsActionListener{
@Override
publicvoidactionPerformed(ActionEvent e) {
String strMsg = tf.getText();
tf.setText("");
try{
dos.writeUTF(strMsg);
dos.flush();
}catch(IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
//开启线程接受服务器信息
privateclassChatThreadimplementsRunnable{
@Override
publicvoidrun() {
try{
bConnected =true;
while(bConnected){
String msg = dis.readUTF();
String taText = ta.getText();
ta.setText(taText+msg+"\n");
}
}catch(SocketException e) {
System.out.println("退出");;
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
ChatServer:
代码如下
packagecom.panda.chat;
importjava.io.*;
importjava.net.*;
importjava.util.*;
publicclassChatServer {
privatebooleanstarted =false;
privateList
publicstaticvoidmain(String[] args) {
newChatServer().startServer();
}
privatevoidstartServer(){
try{
//开启服务端Socket
ServerSocket seso =newServerSocket(8888);
started =true;
while(started){
//接受客户端连接请求
Socket sos = seso.accept();
System.out.println("一个客户端已连接");
//开启线程处理客户端通信
ChatThread ct =newChatThread(sos);
chatThreads.add(ct);
newThread(ct).start();
}
}catch(IOException e) {
e.printStackTrace();
}
}
privateclassChatThreadimplementsRunnable{
privateSocket socket;
privateDataInputStream din=null;
privateDataOutputStream don=null;
privatebooleanbConnected =false;
publicChatThread(Socket socket) {
super();
this.socket = socket;
}
//发送信息的函数
privatevoidsend(String strMsgIn){
try{
don.writeUTF(strMsgIn);
don.flush();
}catch(IOException e){
e.printStackTrace();
}
}
@Override
publicvoidrun() {
try{
din =newDataInputStream(socket.getInputStream());
don =newDataOutputStream(socket.getOutputStream());
//读取数据
bConnected =true;
while(bConnected){
String strMsgIn = din.readUTF();
System.out.println(strMsgIn);
//接收到数据后发送给每个客户端
for(inti =0;i chatThreads.get(i).send(strMsgIn); } } }catch(IOException e) { try{ //如果客户端出错或关闭,直接关闭连接,并移除List中的当前线程 socket.close(); chatThreads.remove(this); }catch(IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }finally{ try{ din.close(); don.close(); socket.close(); }catch(IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } 运行ChatSever后,再同时打开多次ChatClient,就可以实现多人聊天了,你也试试。