永发信息网

用java编写的chat room聊天程序

答案:2  悬赏:70  手机版
解决时间 2021-05-25 22:15
用java编写的chat room聊天程序
最佳答案

这段程序是我以前跟着马士兵老师的教学视频写下来的;你看看吧


  服务器端:


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) {
new ChatServer().start();
}

public void start() {
try {
ss = new ServerSocket(8888);
started = true;
} 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);
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) {
clients.remove(this);
System.out.println("对方退出!");
//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 !");
}


}
} 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();
this.addWindowListener(new WindowAdapter() {


@Override
public void windowClosing(WindowEvent arg0) {
disconnect();
System.exit(0);
}

});
tfTxt.addActionListener(new TFListener());
setVisible(true);
connect();

tRecv.start();
}

public void connect() {
try {
s = new Socket("127.0.0.1", 8888);
dos = new DataOutputStream(s.getOutputStream());
dis = new DataInputStream(s.getInputStream());
System.out.println("connected!");
bConnected = true;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}

public void disconnect() {
try {
dos.close();
dis.close();
s.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 {
//System.out.println(s);
dos.writeUTF(str);
dos.flush();
//dos.close();
} 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 (EOFException e) {
System.out.println("退出,bye - bye!");
} catch (IOException e) {
e.printStackTrace();
}

}

}
}

全部回答
服务器: 主要用到了:ServerSocket类 客户端,主要用了Socket类 而后用到的都是一样的,还有要用到多线程了!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
长沙县长沙欧阳特色粉馆这个地址在什么地方,
粮油榨面在什么地方啊,我要过去处理事情
民间俗语谚语大全,来自民间俗语的成语
济源市济源霍氏牙科河合门诊地址在哪,我要去
彩虹岛矿价
谁能提供关于我国电池或废电池的数量数据 表
2015世萌黄玉贺图asuna原图
谷城县襄樊一新橱柜这个地址在什么地方,我要
E52和C5那个好?
cool 和 wet 的比较级和最高级是什么
新宁县邵阳中华电器行(非磐返?地址在哪,我要
Dun & Bradstreet
咸安区咸宁市环卫局地址在哪里啊
湾背地址有知道的么?有点事想过去
电脑出现USB设备无法识别问题 应该怎么办要不
推荐资讯
郸城县周口温馨家纺这个地址在什么地方,我要
南京《2012 》电影票价
双城区哈尔滨双城人工湖在哪里啊,我有事要去
寻求好玩的游戏无论单机还是网游(不要太大,
有部动画的主人公叫史迪仔,那部动画片的名字
鹤山区鹤壁上品牛肉胡辣汤我想知道这个在什么
OA.OB是圆O的两条半径,且OA⊥OB,C是OB延长线
日本人为什么喜欢成龙,陈坤只是发了三张照片
上什么学校最好
为什么台服都出wow巫妖了,我们还没反应呢?
广东有哪些比较古老历史的滨海乡村?
谁知道松滋老城杨家祠堂杨姓族谱
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?