永发信息网

谁帮忙用JAVA写个客户及服务器模式的小型聊天程序

答案:2  悬赏:0  手机版
解决时间 2021-04-23 00:17
要可以实现客户端服务端多次对话。给出代码最好有解释语句的。我是个新手。谢谢啦。
最佳答案

//服务器端


package net;


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;


//服务器端
public class ServerSocket3 {



public static void main(String[] args) {
ServerSocket server = null;
Socket s = null;
InputStream is = null;
DataInputStream dis = null;
OutputStream os = null;
DataOutputStream dos = null;
BufferedReader br = null;
try {
server = new ServerSocket(4001); //绑定端口号
while(true)
{
s = server.accept(); //用socket类接收并监听客户端
while(true)
{
is = s.getInputStream(); //得到客户端的输入流
dis = new DataInputStream(is);
System.out.println("客户端请求:" + dis.readUTF());
//返回输出流给客户端
os = s.getOutputStream();
dos = new DataOutputStream(os);
br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
dos.writeUTF(str);
}
}

} catch (IOException e) {

e.printStackTrace();
}finally{
try {
server.close();
} catch (IOException e) {

e.printStackTrace();
}
}


}


}
//客户端


package net;



import java.io.*;
import java.net.*;
public class ClientSocket3 {


public static void main(String[] args) {


Socket s = null;
OutputStream os = null;
DataOutputStream dos = null;
InputStream is = null;
DataInputStream dis = null;
BufferedReader br = null;
try {
InetAddress address=InetAddress.getLocalHost();
s = new Socket(address.getHostAddress,4001);
//接收客户端返回的输出流
os = s.getOutputStream();
dos = new DataOutputStream(os);
br = new BufferedReader(new InputStreamReader(System.in));
//向服务器写内容
String str = br.readLine();
//如果输入exit客户端退出
while(!"exit".equals(str))
{
dos.writeUTF(str);
//读取服务器返回的数据
is = s.getInputStream();
dis = new DataInputStream(is);
System.out.println("服务器回应:" + dis.readUTF());
str = br.readLine();
}

} catch (UnknownHostException e) {
System.out.println("找不到主机");
e.printStackTrace();
} catch (IOException e) {
System.out.println("通讯异常");
e.printStackTrace();
}finally{
try {
dos.close();
s.close();
} catch (IOException e) {

e.printStackTrace();
}
}


}


}
就是IO类多了点


耐心点看就能看懂


哪里不懂可以问我

全部回答

服务器端:

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("对方退出了!我从List里面去掉了!"); // 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(); }

}

} }

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
湖人的加索尔什么时候可以归队?
谁知道放弃的歌词
为什么我开通了黄钻之后,进抢车位说没有获取
国马商标廊坊分公司的网址
在网上买动车的学生票。然后学生证没带回来。
梦见自己家的门口雪下的好厚是什么意思
新浪微博如何更改密码,已经登进微博但是忘记
MA是美国哪个州的缩写?
为什么发生性关系后却没有怀孕怎么回事啊
哈尔滨哪里有卖雨衣的 要好看的 可爱一点的那
八月十五的月亮歇后语,除了皎洁的月亮还可以
大连保税区4号门地址有知道的么?有点事想过
电脑报错还蓝屏是什么原因啊?
什么是网球比赛?
有谁知道电视剧蜗居里哪一集小贝带着海藻去看
推荐资讯
有没有玩扣扣手机农场的网址?谢啦
发质偏干偏硬发型太乱怎么办?
几月份的虎宝宝好
要生孩子了有没有遇造
两个人打架如果有一个轻伤,是不是警察先把另
DNF我没用挂,为什么封我的号!腾讯是不是怪我
为什么我斗地主玩不好呢,一开牌就懵了,不知
摩托车没过户我能挂失行驶证吗
b85-pro主板i33450配什么显卡
爱伦坡乌鸦诗歌赏析,乌鸦变黑的童话故事
重庆地区有恐怖份子吗?
街头篮球什么时候出新的特殊角色啊
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?