先看一个服务器端单线程处理程序,此服务器端程序是单线程处理的,每次同一个时间只能处理一个请求程序。如果多个客户端并发访问,则排队等待。
服务端:
package net; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class ServerSocketTest { public static void main(String[] args) throws Exception{ ServerSocket serverSocket = new ServerSocket(10086);//开启10086端口监听 System.out.println(serverSocket.getLocalPort()); System.out.println("server start..."); Socket socket = serverSocket.accept();//服务器已准备,等待客户端连接 InputStream is = socket.getInputStream();//获取客户端输入流 InputStreamReader isr =new InputStreamReader(is); BufferedReader br =new BufferedReader(isr); String info =null; while((info=br.readLine())!=null){ System.out.println("我是服务器,客户端说:"+info); } socket.shutdownInput();//关闭输入流,后续再次调用readLine方法抛异常 //4、获取输出流,响应客户端的请求 OutputStream os = socket.getOutputStream();//向客户端输出 PrintWriter pw = new PrintWriter(os); pw.write("欢迎您!"); pw.flush(); //5、关闭资源 pw.close(); os.close(); br.close(); isr.close(); is.close(); socket.close(); serverSocket.close(); } }
客户端:
package net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class ClientSocketTest { public static void main(String[] args) throws Exception { InetAddress address =InetAddress.getLocalHost(); address.getHostName();//获取计算机名 address.getHostAddress();//获取IP地址 System.out.println(address.getHostName()); System.out.println(address.getHostAddress()); //客户端 //1、创建客户端Socket,指定服务器地址和端口 Socket socket =new Socket(address.getHostName(),10086); //2、获取输出流,向服务器端发送信息 OutputStream os = socket.getOutputStream();//字节输出流 PrintWriter pw =new PrintWriter(os);//将输出流包装成打印流 pw.write("用户名:admin;密码:123"); pw.flush(); socket.shutdownOutput();//关闭输出流,后续再次调用write方法抛异常 //3、获取输入流,并读取服务器端的响应信息 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String info = null; while((info=br.readLine()) != null){ System.out.println("我是客户端,服务器说:"+info); } //4、关闭资源 br.close(); is.close(); pw.close(); os.close(); socket.close(); } }
============================我是分割线==============================
要想实现服务端可以同时处理多个客户端连接,则必须修改服务器端程序,适应多线程并发。服务端主线程收到一个连接之后直接新开一个线程去处理,主线程继续等到其他客户端连接。
服务器:
package net; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ServerSocketTest { public static void main(String[] args) throws Exception{ ServerSocket serverSocket = new ServerSocket(10086);//开启socket服务监听1006端口 System.out.println("server start..."); System.out.println("正在监听"+serverSocket.getLocalPort()); Socket socket = null; while(true) { socket = serverSocket.accept();//服务器在这阻塞监听,连接到客户端立即开启线程分发处理,提高并发 serverPool.execute(new ClientHandle(socket));//线程池并发处理 } // socket.close(); // serverSocket.close(); } //默认服务器最大并发为5个线程 private static ExecutorService serverPool = Executors.newFixedThreadPool(5); } class ClientHandle implements Runnable{ private Socket socket; public ClientHandle(Socket socket) { this.socket = socket; } @Override public void run() { try { InputStream is = socket.getInputStream(); InputStreamReader isr =new InputStreamReader(is); BufferedReader br =new BufferedReader(isr); String info = ""; String temp =null; while((temp=br.readLine())!=null){ info += temp; System.out.println("服务器线程"+Thread.currentThread().getName()+"开始处理客户端请求,当前客户端线程:"+temp); } socket.shutdownInput();//关闭socket输入流,之后再次调用readLine会抛出异常 //4、获取输出流,响应客户端的请求 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); pw.write("服务器线程"+Thread.currentThread().getName()+"对客户端线程说:"+info+"欢迎您!"); pw.flush(); //5、关闭资源 pw.close(); os.close(); br.close(); isr.close(); is.close(); Thread.sleep(new Random().nextInt(5000));//模拟服务器处理时间 } catch (Exception e) { e.printStackTrace(); } } }
客户端:
package net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ClientSocketTest { public static void main(String[] args) throws Exception { ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for(int i= 0 ;i<10;i++) { cachedThreadPool.execute(new Runnable() { @Override public void run() { try { long startTime = System.currentTimeMillis(); InetAddress address =InetAddress.getLocalHost(); address.getHostName();//获取计算机名 address.getHostAddress();//获取IP地址 //客户端 //1、创建客户端Socket,指定服务器地址和端口 Socket socket =new Socket(address.getHostName(),10086); //2、获取输出流,向服务器端发送信息 OutputStream os = socket.getOutputStream();//字节输出流 PrintWriter pw =new PrintWriter(os);//将输出流包装成打印流 pw.write(Thread.currentThread().getName()); pw.flush(); socket.shutdownOutput();//关闭socket输出流,之后再次调用write方法会抛出异常 //3、获取输入流,并读取服务器端的响应信息 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String info = null; while((info=br.readLine()) != null){ System.out.println(info); } //4、关闭资源 br.close(); is.close(); pw.close(); os.close(); socket.close(); long endTime = System.currentTimeMillis(); System.out.println("花费时间:"+(endTime-startTime)); } catch(Exception e) { e.printStackTrace(); } } }); } } }
当服务器线程资源耗尽的时候,每个连接都必须等到空闲连接,所以花费时间开始变长。
相关推荐
Java网络编程是Java开发中的重要领域,它涵盖了网络应用程序的设计、实现和调试。在这个主题下,我们可以探讨多个关键知识点: 1. **Java Socket编程**:Java的Socket类提供了基于TCP/IP协议的网络通信能力。通过...
2. TCP/IP协议:TCP/IP是Internet上最流行的协议,Java网络编程中使用的协议。Java程序员需要了解TCP/IP协议的工作原理和实现机制。 3. Java Socket类:Java中的Socket类是用于实现网络通信的核心类。Java程序员...
《Java程序设计之网络编程》是一本专注于Java网络编程的教材,它涵盖了网络通信的基础理论以及Java语言在实现网络应用中的各种技术。该资源包括课件和源码,旨在帮助学习者通过实践来深入理解Java网络编程的核心概念...
《Java网络编程第三版》是Java开发者深入理解网络编程的重要参考资料。这本书主要涵盖了Java平台上的网络应用程序开发,从基础概念到高级技术,为读者提供了一套全面的学习路径。以下是本书中涉及的一些关键知识点:...
Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程
《Java网络编程(第四版)》是一本深入探讨Java在互联网环境下的编程技术的经典书籍。本书旨在帮助读者理解和掌握如何利用Java语言进行高效、安全的网络通信。书中内容覆盖了从基本的网络概念到复杂的多线程编程,是...
《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...
"Java网络编程实验报告" 本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java ...
java网络编程.pdf
Java Socket网络编程是Java平台中的核心特性,它为开发者提供了在TCP/IP协议下创建网络应用的能力。Socket编程主要用于实现客户端和服务器之间的通信,基于客户机/服务器模型。在这个模型中,服务器端通常处于被动...
2. **Java网络编程API**: - **InetAddress类**:用于处理IP地址和主机名。 - **Socket类和ServerSocket类**:Socket用于客户端,ServerSocket用于服务器端,它们是进行TCP通信的基础。 - **DatagramSocket和...
Java网络编程是计算机科学中的一个重要领域,特别是在软件开发中,它涉及到如何通过网络进行数据传输和通信。在Java中,网络编程主要依赖于Java的Socket编程、ServerSocket、URL类以及NIO(非阻塞I/O)等核心API。这...
java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf
Socket 编程是 Java 网络编程的核心技术之一。Socket 是一种网络通信机制,允许不同的应用程序之间进行通信。Java 提供了 Socket 类和 ServerSocket 类来实现 Socket 编程。Socket 编程可以实现客户端/服务器端的...
Java网络编程
Java网络编程是开发分布式应用程序的关键技术,它使得Java程序能够与其他设备、系统和服务进行通信。本书《Java网络编程实例:Java网络编程实例》显然聚焦于通过实际案例来教授这一核心技能。以下是一些主要的知识点...
这个"java网络编程实例2"很可能包含了深入的实践案例,帮助读者理解并掌握网络编程的基本概念和技术。以下是根据标题和描述可能涵盖的一些关键知识点: 1. **网络基础知识**:在Java中进行网络编程首先需要了解TCP/...
一、Java网络编程基础 1. Socket编程:Java中的Socket类和ServerSocket类是TCP编程的基础。Socket用于建立客户端和服务器之间的连接,而ServerSocket则监听特定端口,等待客户端的连接请求。通过这两个类,开发者...
在TCP/IP协议栈中,Java网络编程通常涉及以下层次: 1. 应用层:这一层包含HTTP、FTP、SMTP等应用协议。Java的`HttpURLConnection`和`HttpClient`库可以处理HTTP通信,而`MailAPI`则处理电子邮件发送。 2. 传输层...
《Java网络编程精解》是孙卫琴老师的一本经典教程,主要涵盖了Java语言在网络编程领域的深度解析。这本书深入浅出地介绍了如何使用Java进行网络通信,包括基本的TCP/IP协议、套接字编程、多线程技术以及HTTP、FTP等...