`
747017186
  • 浏览: 331337 次
社区版块
存档分类
最新评论

java之网络编程(2)

 
阅读更多

先看一个服务器端单线程处理程序,此服务器端程序是单线程处理的,每次同一个时间只能处理一个请求程序。如果多个客户端并发访问,则排队等待

 

服务端:

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();
					}
				}
			});
		}
	}
}

 


 

 当服务器线程资源耗尽的时候,每个连接都必须等到空闲连接,所以花费时间开始变长。

 

 

 

 

  • 大小: 27.2 KB
  • 大小: 30.6 KB
  • 大小: 4.4 KB
  • 大小: 2.5 KB
分享到:
评论

相关推荐

    Java网络编程/Java网络编程实例

    Java网络编程是Java开发中的重要领域,它涵盖了网络应用程序的设计、实现和调试。在这个主题下,我们可以探讨多个关键知识点: 1. **Java Socket编程**:Java的Socket类提供了基于TCP/IP协议的网络通信能力。通过...

    Java网络编程案例教程习题参考答案 .pdf

    2. TCP/IP协议:TCP/IP是Internet上最流行的协议,Java网络编程中使用的协议。Java程序员需要了解TCP/IP协议的工作原理和实现机制。 3. Java Socket类:Java中的Socket类是用于实现网络通信的核心类。Java程序员...

    《Java程序设计之网络编程》

    《Java程序设计之网络编程》是一本专注于Java网络编程的教材,它涵盖了网络通信的基础理论以及Java语言在实现网络应用中的各种技术。该资源包括课件和源码,旨在帮助学习者通过实践来深入理解Java网络编程的核心概念...

    Java网络编程第三版.pdf

    《Java网络编程第三版》是Java开发者深入理解网络编程的重要参考资料。这本书主要涵盖了Java平台上的网络应用程序开发,从基础概念到高级技术,为读者提供了一套全面的学习路径。以下是本书中涉及的一些关键知识点:...

    Java网络高级编程Java网络高级编程

    Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程

    java网络编程第四版pdf

    《Java网络编程(第四版)》是一本深入探讨Java在互联网环境下的编程技术的经典书籍。本书旨在帮助读者理解和掌握如何利用Java语言进行高效、安全的网络通信。书中内容覆盖了从基本的网络概念到复杂的多线程编程,是...

    Java网络编程(第4版)PDF

    《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...

    Java网络编程实验报告.pdf

    "Java网络编程实验报告" 本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java ...

    java网络编程.pdf

    java网络编程.pdf

    Java Socket网络编程.pdf

    Java Socket网络编程是Java平台中的核心特性,它为开发者提供了在TCP/IP协议下创建网络应用的能力。Socket编程主要用于实现客户端和服务器之间的通信,基于客户机/服务器模型。在这个模型中,服务器端通常处于被动...

    java网络编程

    2. **Java网络编程API**: - **InetAddress类**:用于处理IP地址和主机名。 - **Socket类和ServerSocket类**:Socket用于客户端,ServerSocket用于服务器端,它们是进行TCP通信的基础。 - **DatagramSocket和...

    Java网络编程期末考试复习题库+答案

    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 java网络编程pdf

    Java网络编程实践课程设计报告.pdf

    Socket 编程是 Java 网络编程的核心技术之一。Socket 是一种网络通信机制,允许不同的应用程序之间进行通信。Java 提供了 Socket 类和 ServerSocket 类来实现 Socket 编程。Socket 编程可以实现客户端/服务器端的...

    [Java网络编程(第3版,2004)].(Java.Network.Prog.epub

    Java网络编程

    《Java网络编程实例:Java网络编程实例》

    Java网络编程是开发分布式应用程序的关键技术,它使得Java程序能够与其他设备、系统和服务进行通信。本书《Java网络编程实例:Java网络编程实例》显然聚焦于通过实际案例来教授这一核心技能。以下是一些主要的知识点...

    java网络编程实例2

    这个"java网络编程实例2"很可能包含了深入的实践案例,帮助读者理解并掌握网络编程的基本概念和技术。以下是根据标题和描述可能涵盖的一些关键知识点: 1. **网络基础知识**:在Java中进行网络编程首先需要了解TCP/...

    Java程序设计之网络编程

    一、Java网络编程基础 1. Socket编程:Java中的Socket类和ServerSocket类是TCP编程的基础。Socket用于建立客户端和服务器之间的连接,而ServerSocket则监听特定端口,等待客户端的连接请求。通过这两个类,开发者...

    java网络高级编程

    在TCP/IP协议栈中,Java网络编程通常涉及以下层次: 1. 应用层:这一层包含HTTP、FTP、SMTP等应用协议。Java的`HttpURLConnection`和`HttpClient`库可以处理HTTP通信,而`MailAPI`则处理电子邮件发送。 2. 传输层...

    Java网络编程精解(孙卫琴)电子教案

    《Java网络编程精解》是孙卫琴老师的一本经典教程,主要涵盖了Java语言在网络编程领域的深度解析。这本书深入浅出地介绍了如何使用Java进行网络通信,包括基本的TCP/IP协议、套接字编程、多线程技术以及HTTP、FTP等...

Global site tag (gtag.js) - Google Analytics