通信过程图(有点暴力,如不适应请及时退出)
代码
TCPServer.java
package moe.iloli.socket;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class ServerClient implements Runnable{
Socket socket = null;
public static OutputStream outputStream = null;
public ServerClient(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (true) {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = (bufferedReader.readLine());
sendMsg(socket, msg);
} catch (Exception e) {
try {
socket.close();
TCPServer.arrayList.remove(socket);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
e.printStackTrace();
}
}
}
public void sendMsg(Socket socket, String clientMsg) throws Exception{
for (Socket client : TCPServer.arrayList) {
if (client == socket) {
outputStream = socket.getOutputStream();
// outputStream.write((clientMsg +"\n").getBytes());
continue;
}
outputStream = client.getOutputStream();
outputStream.write((clientMsg+"\n").getBytes());
}
}
}
public class TCPServer {
public static ArrayList<Socket> arrayList = new ArrayList<>();
protected static List<Socket> list = new ArrayList<>();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(23333, 100,
InetAddress.getByName("localhost"));
System.out.println("您的抽象服务器已开启:" + serverSocket.getLocalSocketAddress());
while (true) {
Socket activeSocket = serverSocket.accept();
arrayList.add(activeSocket);
ServerClient serverClient = null;
serverClient = new ServerClient(activeSocket);
new Thread(serverClient).start();
}
}
}
TCPClient1.java
package moe.iloli.socket;
import java.io.*;
import java.net.Socket;
public class TCPClient1 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 23333);
System.out.println("抽象客户端(A):"
+ socket.getLocalSocketAddress());
BufferedReader socketReader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
BufferedReader clientReader = new BufferedReader(
new InputStreamReader(System.in));
String msg = null;
while((msg = clientReader.readLine()) != null){
socketWriter.write("Client (A): " + msg + "\n");
socketWriter.flush();
String inMsg = socketReader.readLine();
System.out.println(inMsg);
}
socket.close();
}
}
TCPClient2.java
package moe.iloli.socket;
import java.io.*;
import java.net.Socket;
public class TCPClient1 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 23333);
System.out.println("抽象客户端(A):"
+ socket.getLocalSocketAddress());
BufferedReader socketReader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
BufferedReader clientReader = new BufferedReader(
new InputStreamReader(System.in));
String msg = null;
while((msg = clientReader.readLine()) != null){
socketWriter.write("Client (A): " + msg + "\n");
socketWriter.flush();
String inMsg = socketReader.readLine();
System.out.println(inMsg);
}
socket.close();
}
}
当你跑完上面的代码后,恭喜你,你得到了一个错误的程序!
实际上真正的发送顺序是这样的
懒得改了,就这样吧