1、使用多线程+TCP实现简单聊天程序
能跑但是少注释!!!
public class ClientChat {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入服务器ip:");
String serverIp = reader.readLine();
Socket client = new Socket(serverIp, 3000);
boolean flag = true;
OutputStream outputStream = client.getOutputStream();
InputStream inputStream = client.getInputStream();
String userName = "";
//循环判断用户名是否重复
while(flag) {
System.out.println("请输入用户名:");
userName = reader.readLine();
String userNameInfo = "name-" + userName;
outputStream.write(userNameInfo.getBytes());
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
String serverInfo = new String(bytes, 0, len);
if (serverInfo.equals("yes")) {
flag = false;
}
}
System.out.println("欢迎" + userName + "进入聊天程序");
System.out.println("[@所有人---【public-用户名-具体内容-时间】]");
System.out.println("[@退出---【exit】]");
ClientThread clientThread = new ClientThread(inputStream);
clientThread.start();
boolean flagIo = true;
while(flagIo){
String sendInfo = "";
System.out.println("请输入内容");
String context = reader.readLine();
String[] split = context.split("-");
if(split[0].equals("public")) {
//public-用户名-具体内容-时间
sendInfo = "public-" + userName + "-" + split[1] + "-" + getTime();
}
if(split[0].equals("exit")){
sendInfo = "exit-" + userName + "-" + getTime();
}
outputStream.write(sendInfo.getBytes());
}
reader.close();
inputStream.close();
outputStream.close();
client.close();
clientThread.stop();
}
/**
* 格式化时间
* @return
*/
private static String getTime() {
return new SimpleDateFormat("yyyy/MM/dd HH:mm:ss E").format(new Date());
}
}
public class ClientThread extends Thread{
private InputStream inputStream;
public ClientThread(InputStream inputStream){
this.inputStream= inputStream;
}
@Override
public void run() {
boolean flag = true;
try {
while(flag){
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
String s = new String(bytes, 0, len);
System.out.println("接收的信息:" + s);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}
public class ServerChat {
public static void main(String[] args) throws IOException {
Map<String,Socket> userList = new HashMap<>();
ServerSocket serverSocket = new ServerSocket(3000);
System.out.println("====服务器已经启动====");
boolean flag = true;
while(flag){
Socket client = serverSocket.accept();
ServerThread serverThread = new ServerThread(client, userList);
serverThread.start();
}
}
}
public class ServerThread extends Thread {
private Socket client;
private Map<String,Socket> userList;
public ServerThread(Socket client,Map<String,Socket> userList){
this.client = client;
this.userList = userList;
}
boolean flag = true;
private String serverMs = "";
@Override
public void run() {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = client.getInputStream();
outputStream = client.getOutputStream();
byte[] bytes = new byte[1024];
while(flag){
int len = inputStream.read(bytes);
String result = new String(bytes, 0, len);
String[] split = result.split("-");
if(split[0].equals("name")){
System.out.println("用户名---" + split[1]);
if(userList.containsKey(split[1])){
serverMs = "no";
}else{
serverMs = "yes";
userList.put(split[1],client);
}
outputStream.write(serverMs.getBytes());
}
//public-用户名-具体内容-时间
if(split[0].equals("public")){
serverMs = split[1] + "@所有人:" + split[2] + " " + split[3];
Collection<Socket> socketList = userList.values();
for (Socket socket : socketList) {
OutputStream outputStream1 = socket.getOutputStream();
outputStream1.write(serverMs.getBytes());
}
}
//exit-用户名-时间
if(split[0].equals("exit")){
serverMs = split[1] + "@所有人:已经离开" + split[2];
Collection<Socket> socketList = userList.values();
for (Socket socket : socketList) {
OutputStream outputStream1 = socket.getOutputStream();
outputStream1.write(serverMs.getBytes());
}
//删除map中的当前用户
userList.remove(split[1]);
flag = false;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try{
this.client.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}