前言
这几天学习了一下多线程和Java网络编程(具体可以看我博客里的Java相关学习笔记),然后自己实现了一个局域网聊天,但是由于疫情原因不在寝室,没有经过多电脑测试,只是在本机的IP下开多个客户端是没有问题的
相关代码
//发送端(客户端)
package GroupTalk;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Send {
private static String name = "001";
public static void TCPSend() throws UnknownHostException, IOException {
InetAddress Host = InetAddress.getLocalHost(); //获取本机的相关信息
Socket s = new Socket(Host.getHostAddress(), 10000);
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
System.out.print("please input your username:");
Scanner sc = new Scanner(System.in);
name = sc.next();
bw.write("欢迎" + name + "加入群聊!");
bw.newLine();
bw.flush();
String line;
while((line = bf.readLine()) != null) {
if(line.equals("exits.")) break;
bw.write(name + ": " + line);
bw.newLine();
bw.flush();
}
sc.close();
s.close();
}
public static void main(String[] args) throws UnknownHostException, IOException {
TCPSend();
}
}
//接收端(只能接收一个客户端)
package GroupTalk;
import java.io.*;
import java.net.*;
public class Receive extends Thread {
private Socket s;
private BufferedReader bf;
public Receive(Socket m_s) throws IOException {
s = m_s;
bf = new BufferedReader(new InputStreamReader(s.getInputStream()));
start(); //直接在构造函数里面将线程启动
}
public synchronized void TCPReceive() {
try {
String line;
while((line = bf.readLine()) != null) {
System.out.println(line);
}
s.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
@Override
public void run() {
TCPReceive();
}
}
//基于接收端的多客户端接收实现
package GroupTalk;
import java.io.IOException;
import java.net.*;
public class MutiReceive {
private static int Root = 10000;
public static void main(String args[]) throws IOException {
ServerSocket s = new ServerSocket(Root);
try {
while(true) { //不停地等待新的客户端连接
Socket ss = s.accept();
try {
new Receive(ss);
} finally {
ss.close(); //无论如何也要关闭
}
}
} finally {
s.close(); //无论如何也要关闭
}
}
}