目录
一、Socket编程一般步骤
二、简单客户端到服务端通信
三、实现局域网聊天室
四、扩展:实现客户-服务端对象传输
Socket 编程是一种用于网络通信的编程模型,它允许不同计算机之间的进程通过网络进行通信。使用 Socket 编程,您可以在客户端和服务器之间建立网络连接,并通过套接字(Socket)进行数据传输。
Socket 编程一般步骤如下:
(1)创建服务器端Socket
服务器使用 ServerSocket 类创建一个监听指定端口的套接字。例如:ServerSocket serverSocket = new ServerSocket(port); 然后调用 accept() 方法等待客户端连接。一旦有客户端连接,accept() 方法将返回一个代表客户端的新 Socket 对象。
(2)客户端创建 Socket
客户端使用 Socket 类创建一个套接字,并指定服务器的 IP 地址和端口号。例如:Socket socket = new Socket(serverIP, port);
(3)进行数据传输
一旦建立连接,服务器和客户端可以使用 InputStream 和 OutputStream 对象来进行数据的读取和写入。服务器和客户端都可以通过 InputStream() 和 OutputStream() 方法获取这些流对象。
(4)关闭连接
当数据传输完成后,可以通过调用 close() 方法关闭套接字和相关的流。
有关IO输入输出流的使用请参考:Java IO
以下是一个简单的客户-服务端示例程序,在这个示例中先建立连接然后发送文本内容再关闭连接。
服务端示例代码:
public static void main(String[] args) {try {ServerSocket serverSocket = new ServerSocket(6000);System.out.println("服务端已启动,正在监听端口 6000");Socket socket = serverSocket.accept();System.out.println("与客户端建立传话,客户端地址:" + RemoteSocketAddress().toString());InputStream inputStream = InputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String message;while ((message = adLine()) != null) {System.out.println("他(客户端)说:" + message);}OutputStream outputStream = OutputStream();message = "您好,客户端!";outputStream.Bytes());System.out.println("我(服务端)说:" + message);outputStream.close();System.out.println("与客户端会话结束");bufferedReader.close();inputStream.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
客户端示例代码:
public static void main(String[] args) {try {System.out.println("准备连接到服务器,端口 6000");Socket clientSocket = new Socket("127.0.0.1", 6000);OutputStream outputStream = OutputStream();String message = "您好,服务器!";outputStream.Bytes());System.out.println("我(客户端)说:" + message);InputStream inputStream = InputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));while ((message = adLine()) != null) {System.out.println("他(服务端)说:" + message);}inputStream.close();System.out.println("与服务器会话结束");outputStream.close();clientSocket.close();} catch (IOException e) {e.printStackTrace();}}
以下是一个简单的基于控制台的聊天室程序,在这个示例中开启一个服务端和多个客户端。然后各客户端可以在一起发布文消息进行聊天。
服务端代码:
private static boolean IsCloseServer = false;private static ConcurrentHashMap<Integer, ClientInfo> SocketClients = new ConcurrentHashMap<>();public static void Main(String[] args) {Scanner scanner = new Scanner(System.in);SocketServerThread thread = new SocketServerThread();thread.start();while ("quit".())) {IsCloseServer = true;break;}System.out.println("main exit");}public static class SocketServerThread extends Thread {@Overridepublic void run() {super.run();try {ServerSocket serverSocket = new ServerSocket(6000);System.out.println("服务端已启动,正在监听端口 6000,输入 quit 回车可退出服务。");List<Thread> threadPool = new ArrayList<>();int clientId = 0;while (!IsCloseServer) {Socket socket = serverSocket.accept();ClientInfo clientInfo = null;synchronized (this) {clientInfo = new ClientInfo(++clientId, socket);}SocketClients.Id(), clientInfo);System.out.println("与客户端建立传话,id=" + Id());SocketRemoteThread thread1 = new SocketRemoteThread(clientInfo);thread1.start();
// //thread1.join();threadPool.add(thread1);}for (Thread thread : threadPool) {thread.interrupt();try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}}threadPool.clear();SocketClients.clear();System.out.println("服务端关闭");serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}public static class SocketRemoteThread extends Thread {private ClientInfo Client;private Socket clientSocket;public SocketRemoteThread(ClientInfo client) {this.Client = client;this.clientSocket = client.socket;}@Overridepublic void run() {super.run();InputStream inputStream = null;BufferedReader bufferedReader = null;try {inputStream = InputStream();bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String message = null;while (!IsCloseServer) {message = adLine();if(message!= null) {BroadcastMessage(this.clientSocket, message);}}System.out.println("user exit");} catch (IOException e) {e.printStackTrace();}finally {try {bufferedReader.close();inputStream.close();} catch (IOException e) {e.printStackTrace();}System.out.println("与客户端会话结束,id=" + Id());ve(Id());try {this.clientSocket.close();} catch (IOException e) {e.printStackTrace();}}}}private static synchronized void BroadcastMessage(Socket self, String message){System.out.println("广播消息:" + message);Set<Map.Entry<Integer, ClientInfo>> clients = Set();for (Map.Entry entry: clients){ClientInfo clientInfo = (ClientInfo) Value();Socket socket = clientInfo.socket;RemoteSocketAddress().RemoteSocketAddress())){continue;}try {OutputStream outputStream = OutputStream();PrintWriter printWriter = new PrintWriter(outputStream);message = String.format("[%s]说:%s", RemoteSocketAddress().toString(), message);//outputStream.Bytes());printWriter.println(message);printWriter.flush();}catch (SocketException e){e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}
客户端代码(自行复制多份,在不同控制台中进行聊天):
private static boolean IsCloseClient = false;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);try {System.out.println("准备连接到服务器,端口 6000");Socket clientSocket = new Socket("127.0.0.1", 6000);ReceiveMessageThread thread1 = new ReceiveMessageThread(clientSocket);thread1.start();OutputStream outputStream = OutputStream();PrintWriter printWriter = new PrintWriter(outputStream);String message;message = "大家您好![自动消息]";//outputStream.Bytes());printWriter.println(message);printWriter.flush();System.out.println("我说:" + message);while (!IsCloseClient) {System.out.println("请输入您想说的话:");message = ();if("quit".equals(message)){IsCloseClient = true;break;}if(message!=null && !"".equals(message)) {//outputStream.Bytes());printWriter.println(message);printWriter.flush();System.out.println("我说:" + message);}}System.out.println("与服务器会话结束");printWriter.close();outputStream.close();//clientSocket.shutdownInput();//clientSocket.shutdownOutput();clientSocket.close();} catch (IOException e) {e.printStackTrace();}}public static class ReceiveMessageThread extends Thread {private Socket socket;public ReceiveMessageThread(Socket s) {this.socket = s;}@Overridepublic void run() {super.run();InputStream inputStream = null;BufferedReader bufferedReader = null;try {inputStream = InputStream();bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String message;while (!IsCloseClient && (message = adLine()) != null) {System.out.println(message);}} catch (IOException e) {e.printStackTrace();} finally {try {//socket.shutdownInput();bufferedReader.close();inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
以下是一个简单的客户-服务端示例程序,但是在这个示例中我们把一个Java对象通过Socket传送给对方。这使用了ObjectInputStream、ObjectOutputStream来进行对象的序列化操作。实际操作中也可以使用JSON、XML等序列化工具。
服务端示例代码:
public static void main(String[] args) {try {ServerSocket serverSocket = new ServerSocket(6000);System.out.println("服务端已启动,正在监听端口 6000");Socket socket = serverSocket.accept();System.out.println("与客户端建立传话,客户端地址:" + RemoteSocketAddress().toString());InputStream inputStream = InputStream();ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);Object obj = adObject();if (obj != null) {System.out.println("他(客户端)发来对象:" + ((Test099_SocketClient.TestInfo) obj).getId());}OutputStream outputStream = OutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);Test099_SocketClient.TestInfo testInfo = new Test099_SocketClient.TestInfo(2, "您好,客户端!");objectOutputStream.writeObject(testInfo);System.out.println("我(服务端)回复对象 id=" + Id());objectOutputStream.close();outputStream.close();System.out.println("与客户端会话结束");objectInputStream.close();inputStream.close();socket.close();serverSocket.close();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
客户端示例代码:
public static void main(String[] args) {try {System.out.println("准备连接到服务器,端口 6000");Socket clientSocket = new Socket("127.0.0.1", 6000);OutputStream outputStream = OutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);TestInfo testInfo = new TestInfo(1, "您好,服务器!");objectOutputStream.writeObject(testInfo);System.out.println("我(客户端)发送对象 id=" + Id());InputStream inputStream = InputStream();ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);Object obj = adObject();if (obj != null) {System.out.println("从(服务端)接收对象 id=" + ((TestInfo) obj).getId());}objectInputStream.close();inputStream.close();System.out.println("与服务器会话结束");outputStream.close();clientSocket.close();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
本文发布于:2024-02-02 07:36:40,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170683059942321.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |