上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后续Client不能再继续连接,所以需要做些改动。
当Server每次接受到一个Client的请求之后,都建立一个线程,然后继续等待下一个Client的连接请求。这样就不会阻塞Server端接收请求了。具体代码如下:
代码流程图如下:
服务端的代码
public class MyServer1 implements Runnable { private Socket socket; private String clientId; public MyServer1(Socket socket) { this.socket = socket; } public static void main(String[] args) throws IOException { int port = 9999; // 监听服务器端口 ServerSocket server = new ServerSocket(port); System.out.println("listening on " + port); while(true) { Socket socket = server.accept(); new Thread(new MyServer1(socket)).start(); } } public void run() { // 设置客户端名称,方便区分不同client setClientId(); System.out.println("the client " + this.getClientId() + " has connected!"); // 获取客户端的输入流 BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 获取客户端的输出流 out = new PrintWriter(socket.getOutputStream()); while (true) { String msg = in.readLine(); System.out.println("----------------------------------------------------"); System.out.println("-------------client " + this.getClientId() + "--------------"); System.out.println("----------------------------------------------------"); System.out.println("\nServer received " + msg); if (msg.equals("bye")) { System.out.println("Server stoped!"); break; } else { // 向客户端发送信息 System.out.println("Server send " + msg + "\n"); out.print("Server responsed " + msg); out.flush(); } } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e1) { e1.printStackTrace(); } } } public String getClientId() { return clientId; } public void setClientId() { Time now = new Time(new Date().getTime()); this.clientId = socket.getInetAddress().getHostAddress() + "-" + now.toString(); } }
客户端代码
public class MyClient { public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException { Scanner reader = new Scanner(System.in); // 创建客户端socket Socket client = new Socket("localhost", 9999); // 获取客户端的输出流(获取服务器端的输入流) PrintWriter out = new PrintWriter(client.getOutputStream()); // 获取客户端的输入流(获取服务器端的输出流) InputStream in = client.getInputStream(); while (true) { System.out.println("---------------------------"); System.out.println("Input Something: "); String msg = reader.nextLine(); System.out.println("Client sended " + msg); out.println(msg); out.flush(); Thread.sleep(1000); byte[] buff = new byte[in.available()]; in.read(buff); System.out.println(new String(buff, "UTF-8")); if (msg.equals("bye")) { System.out.println("Client stop!"); break; } } out.close(); client.close(); } }
先运行MyServer1类,再运行两个MyClient类(相当与两个线程)。结果如下所示:
clent1(127.0.0.1-16:22:53)
--------------------------- Input Something: 11 Client sended 11 Server responsed 11 --------------------------- Input Something: 123 Client sended 123 Server responsed 123 --------------------------- Input Something: bye Client sended bye Client stop!
client2(1127.0.0.1-16:22:59)
--------------------------- Input Something: 333 Client sended 333 Server responsed 333 --------------------------- Input Something: bye Client sended bye Client stop!
服务端
listening on 9999 the client 127.0.0.1-16:22:53 has connected! the client 127.0.0.1-16:22:59 has connected! ---------------------------------------------------- -------------client 127.0.0.1-16:22:59-------------- ---------------------------------------------------- Server received 333 Server send 333 ---------------------------------------------------- -------------client 127.0.0.1-16:22:53-------------- ---------------------------------------------------- Server received 11 Server send 11 ---------------------------------------------------- -------------client 127.0.0.1-16:22:53-------------- ---------------------------------------------------- Server received 123 Server send 123 ---------------------------------------------------- -------------client 127.0.0.1-16:22:53-------------- ---------------------------------------------------- Server received bye Server stoped! ---------------------------------------------------- -------------client 127.0.0.1-16:22:59-------------- ---------------------------------------------------- Server received bye Server stoped!
这种实现方式有以下不足之处
1、服务器创建和销毁工作线程的开销很大;
2、活动的线程也消耗系统资源。每个线程本身都会占用一定的内存(每个线程需要大约1MB内存),这样就很容易导致系统的内存不足;
3、Java虚拟机会为每个线程分配独立的堆栈空间,工作线程数目越多,系统开销越大,而且增加了Java虚拟机调度线程的负担,增加了线程之间同步的复杂性,提高了线程死锁的可能性。
4、工作线程的许多时间都浪费在阻塞I/O操作上,Java虚拟机需要频繁地转让CPU的使用权,使进入阻塞状态的线程放弃CPU,再把CPU分配给处于可运行状态的线程。
相关推荐
我们将结合"Java Socket实战之二 多线程通信"这篇博文进行深入解析。 首先,了解Socket的基本概念。Socket在计算机网络中扮演着客户端与服务器之间通信的桥梁角色。它提供了低级别的、面向连接的、基于TCP/IP协议的...
总结来说,Java Socket多线程是构建高并发网络服务的关键技术。通过合理地设计和实现,可以有效地提升服务器的并发处理能力,为用户提供更高效的服务。在实际项目中,应根据具体需求选择适合的线程模型,例如线程池...
Java Socket多线程简易实现是网络编程中的一个基础概念,主要应用于客户端与服务器之间的通信。在Java中,Socket是基于TCP协议的,提供了一种可靠的、面向连接的字节流通信方式。多线程则是Java并发编程的重要特性,...
在“java socket tcpip多线程网络通信服务器客户端”这个主题中,我们将深入探讨如何使用Java Socket实现基于TCP/IP协议的多线程服务器和客户端通信。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的...
Java Socket 多线程通信技术 Java Socket 通信技术是网络通信的关键技术之一。通过实现一个简单的服务端、客户端聊天程序,文章对 Java Socket 通信技术的原理和实现进行了详细的介绍。 网络通信设计 网络通信...
基于多线程实现的JavaSocket客户端-服务端点对点异步通信程序代码
Java Socket 多线程通信是网络编程中的一个重要概念,它涉及到Java的基础网络API以及多线程技术。在Java中,Socket是实现客户端-服务器通信的基础,而多线程则允许程序同时处理多个任务,这对于构建能够同时服务多个...
在这个“Java Socket 多线程实例”中,我们将会探讨如何结合这两个关键概念来创建一个聊天服务器和客户端应用。 首先,`ChatServer.java` 文件通常包含了服务器端的代码。在Java中,通过`java.net.ServerSocket` 类...
在Java编程领域,多线程Socket通信是一种常见且重要的网络编程技术。Socket是TCP/IP协议栈中的一个关键组件,用于在网络中实现进程间的通信。在这个名为"JAVA写的多线程socket通信程序源码"的项目中,我们可以看到...
Java Socket多线程文件传输实例项目是一个典型的网络编程应用场景,主要涉及了Socket编程、多线程处理以及文件I/O操作等关键知识点。在这个项目中,开发者利用Java的Socket API实现了一个能够支持多个客户端同时进行...
Java Socket多线程聊天软件是基于Java编程语言构建的一个网络通信应用,主要利用Socket API来实现客户端与服务器之间的实时通信。在这个系统中,服务器端能够同时处理多个客户端连接,这得益于Java的多线程特性。SWT...
总的来说,本项目结合了Java的Socket通信、多线程并发控制、Hibernate ORM以及MySQL数据库,构建了一个能处理并发网络请求并存储信息的系统。这样的设计使得系统具备良好的扩展性和健壮性,能够高效地服务大量用户。...
Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口来实现,而 Socket 编程则...
Java Socket 是 Java 语言中实现网络通信的基本组件之一,多线程通信是指在服务器端和客户端之间实现在多个线程中进行通信的过程。在 Java 中,使用 Socket 来实现多线程通信需要解决两个问题:一是服务器端如何...
Java Socket 是一种网络通信协议,它是Java...实际的代码会包含更多的细节,如错误处理、多线程管理和用户界面交互等。通过学习和实践这个示例,你可以进一步提升对Java网络编程的理解,并能够构建自己的简单聊天应用。
### Java Socket多线程服务器源代码介绍 #### 一、Java Socket基础知识 在开始之前,我们先了解一下Java Socket的基本概念。Socket是一种用于网络通信的技术,它允许不同计算机上的应用程序通过网络进行通信。Java...
本篇文章将深入探讨如何使用Java NIO(非阻塞I/O)来实现阻塞多线程通信,这对于高性能服务器端应用尤其重要。我们将会分析`EchoServer.java`、`EchoClient.java`和`SocketUtils.java`这三个文件中的关键知识点。 ...
要查看具体的代码实现,你需要检查`src`目录下的文件,通常在`java`或`src/main/java`这样的路径下,找到相关的类文件,比如`ServerSocketThread.java`或其他类似的名字,那里会有实现多线程服务器的代码。
Java TCP多线程通信是网络编程中的一个重要概念,它结合了Java的Socket编程与多线程技术,使得多个客户端能够同时与服务器进行交互。在Java中,TCP(传输控制协议)提供了一种可靠的数据传输方式,确保数据的有序、...
"serverandclient.txt"可能是一个简单的服务器和客户端程序的示例,展示了如何使用Java等编程语言实现Socket多线程通信。 在实际开发中,需要注意的是,多线程通信会带来同步和互斥的问题,需要使用适当的锁机制...