Java网络Socket编程详解

1、Socket 通信简介及模型

  Java Socket 可实现客户端--服务器间的双向实时通信。java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端。

2、使用套接字实现基于TCP协议的服务器和客户机程序  

       依据TCP协议,在C/S架构的通讯过程中,客户端和服务器的Socket动作如下:
    (1)客户端:
          1.用服务器的IP地址和端口号实例化Socket对象。
          2.调用connect方法,连接到服务器上。
          3.将发送到服务器的IO流填充到IO对象里,比如BufferedReader/PrintWriter。
          4.利用Socket提供的getInputStream和getOutputStream方法,通过IO流对象,向服务器发送数据流。
          5.通讯完成后,关闭打开的IO对象和Socket。
    (2)服务器:
          1. 在服务器,用一个端口来实例化一个 ServerSocket对象。此时,服务器就可以这个端口时刻监听从客户端发来的连接请求。
          2.调用ServerSocket的accept方法,开始监听连接从端口上发来的连接请求。   
          3.利用accept方法返回的客户端的Socket对象,进行读写IO的操作
          4.通讯完成后,关闭打开的流和Socket对象。

3、Socket 通信实现方法

     3.1  服务器端(非多线程)    
          1.用指定的端口实例化一个SeverSocket对象。服务器就可以用这个端口监听从客户端发来的连接请求。
          2.调用ServerSocket的accept()方法,以在等待连接期间造成阻塞,监听连接从端口上发来的连接请求。
          3.利用accept方法返回的客户端的Socket对象,进行读写IO的操作
          4.关闭打开的流和Socket对象

	/**
	 * 基于TCP协议的Socket通信,实现用户登录,服务端
	*/
	//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
	ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某个端口
	//2、调用accept()方法开始监听,等待客户端的连接
	Socket socket = serverSocket.accept();
	//3、获取输入流,并读取客户端信息
	InputStream is = socket.getInputStream();
	InputStreamReader isr =newInputStreamReader(is);
	BufferedReader br =newBufferedReader(isr);
	String info =null;
	while((info=br.readLine())!=null){
	System.out.println("Hello,我是服务器,客户端说:"+info);
	}
	socket.shutdownInput();//关闭输入流
	//4、获取输出流,响应客户端的请求
	OutputStream os = socket.getOutputStream();
	PrintWriter pw = new PrintWriter(os);
	pw.write("Hello World!");
	pw.flush();
	 
	//5、关闭资源
	pw.close();
	os.close();
	br.close();
	isr.close();
	is.close();
	socket.close();
	serverSocket.close();

     3.2  客户端
          1.用服务器的IP地址和端口号实例化Socket对象。
          2.调用connect方法,连接到服务器上。
          3.获得Socket上的流,把流封装进BufferedReader/PrintWriter的实例,以进行读写
          4.利用Socket提供的getInputStream和getOutputStream方法,通过IO流对象,向服务器发送数据流
          5.关闭打开的流和Socket。

	//1、创建客户端Socket,指定服务器地址和端口
	Socket socket =newSocket("127.0.0.1",10086);
	//2、获取输出流,向服务器端发送信息
	OutputStream os = socket.getOutputStream();//字节输出流
	PrintWriter pw =newPrintWriter(os);//将输出流包装成打印流
	pw.write("用户名:admin;密码:admin");
	pw.flush();
	socket.shutdownOutput();
	//3、获取输入流,并读取服务器端的响应信息
	InputStream is = socket.getInputStream();
	BufferedReader br = new BufferedReader(new InputStreamReader(is));
	String info = null;
	while((info=br.readLine())!null){
	 System.out.println("Hello,我是客户端,服务器说:"+info);
	}
	  
	//4、关闭资源
	br.close();
	is.close();
	pw.close();
	os.close();
	socket.close();

     3.3  服务器端 (多线程)
         1.服务器端创建ServerSocket,循环调用accept()等待客户端连接
         2.客户端创建一个socket并请求和服务器端连接
         3.服务器端接受客户端请求,创建socket与该客户建立专线连接
         4.建立连接的两个socket在一个单独的线程上对话
         5.服务器端继续等待新的连接

	//服务器线程处理 和本线程相关的socket
	Socket socket =null;
	public serverThread(Socket socket){
	this.socket = socket;
	}
	ServerSocket serverSocket =newServerSocket(10086);
	Socket socket =null;
	int count =0;//记录客户端的数量
	while(true){
	socket = serverScoket.accept();
	ServerThread serverThread =newServerThread(socket);
	 serverThread.start();
	 count++;
	System.out.println("客户端连接的数量:"+count);
	}

参考资料: http://www.blogjava.net/Reg/archive/2010/07/17/326392.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值