Java网络Socket编程详解
来源:互联网 发布:c语言 va list 编辑:程序博客网 时间:2024/05/10 11:46
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.服务器端继续等待新的连接
//服务器线程处理 和本线程相关的socketSocket 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
- Java网络socket编程详解
- Java网络socket编程详解
- Java网络socket编程详解
- Java网络socket编程详解
- Java网络(Socket编程)详解
- Java网络socket编程详解
- Java网络socket编程详解
- java网络socket编程详解
- java网络socket编程详解
- Java网络Socket编程详解
- java网络编程02-Socket用法详解
- java网络编程---socket用法详解(学习心得)
- java 网络编程之Socket详解
- Socket网络编程详解
- 网络编程socket编程详解
- Java网络编程--Socket
- java 网络编程socket
- Java网络编程-Socket
- 各大网站视频自动播放代码(优酷、搜狐、酷6、土豆等)
- RabbitMQ使用总结(一)
- 面试总结(1)
- js基础(使用Canvas画图)
- [转]微服务与Docker
- Java网络Socket编程详解
- windows bat脚本编写
- 彩色图象锐化处理
- MTK6735 android 5.1编译错误 提示:make mrproper
- 跳到指定的循环
- PAT B1036.跟奥巴马一起编程
- android之AsyncTask
- HDU 3605 Escape (二分图多重匹配模板)
- IntentFilter相关