要实现网络编程首先要实现单发单收,在单发单收的基础上使用多线程使其实现多发多收。然后在此基础上进行改进,以实现“群聊”的功能。实现思路是这样的,由于发送消息的本质是将消息发送给服务器,如果我们在服务器端实现将收到的信息转发给所有的用户,然后每一个用户在进行 “群聊”时都可以接收到由服务器转发过来的其他用户的信息,即可实现群聊的功能。
我们直接用代码实现:
服务器端:
public class getThread extends Thread{
private Socket socket;
public getThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
System.out.println(socket.getInetAddress().getHostAddress()+"进入连接");
while(true){
String s = dataInputStream.readUTF();
System.out.print(socket.getInetAddress().getHostAddress()+":");
System.out.println(s);
send(s);
}
} catch (Exception e) {
get.list.remove(socket);
System.out.println(socket.getInetAddress().getHostAddress()+"退出连接");
}
}
private void send(String s) throws Exception{
for (Socket listSocket : get.list) {
OutputStream outputStream = listSocket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(s);
dataOutputStream.flush();
}
}
}
这里我们使用多线程来装载我们的服务器,我们再创建一个启动类:
public class get {
public static List<Socket> list = new ArrayList<>();
public static void main(String[] args) throws Exception {
ServerSocket socket = new ServerSocket(6666);
while (true) {
Socket accept = socket.accept();
list.add(accept);
new getThread(accept).start();
}
}
}
至此我们的服务器就搭建好了,我们来编写客户端:
public class sentThread extends Thread{
private Socket socket;
public sentThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
System.out.println(socket.getInetAddress().getHostAddress()+"进入连接");
while(true){
String s = dataInputStream.readUTF();
System.out.print(socket.getInetAddress().getHostAddress()+":");
System.out.println(s);
}
} catch (Exception e) {
get.list.remove(socket);
System.out.println(socket.getInetAddress().getHostAddress()+"退出连接");
}
}
}
我们再创建一个启动类以启动客户端:
public class sent {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
Socket s = new Socket(InetAddress.getLocalHost(), 6666);
new sentThread(s).start();
OutputStream outputStream = s.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
while (true) {
String st = sc.next();
dataOutputStream.writeUTF(st);
if (st.equals("再见")) {
break;
}
}
dataOutputStream.close();
s.close();
}
}
至此,只需要分别启动服务端、服务端启动类、客户端和客户端启动类即可实现“群聊”。而在其中我们添加了一个判断语句,如果检测到发送“再见”,就会退出“群聊”。