Socket通信基础篇(一)
来源:互联网 发布:数据库系统工程视频 编辑:程序博客网 时间:2024/05/22 09:40
现在的APP几乎都涵盖了通信这个概念,提到通信,就得用到Socket和UDP。Socket是一种基于TCP/IP协议,建立稳定连接的点对点通信,它的特点是安全性高,数据不会丢失,但是很占系统资源。
Socket又叫做套接字,它的通信原理还是比较简单的。大致分为以下几个步骤。
服务器端的步骤如下。
(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。
备注:
0~1023 的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为 23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。 Socket socket = ss.accept();
(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。
(3)当完成通信后,服务器关闭与客户端的Socket连接。
客户端的步骤如下。
(1)建立客户端的Socket,确定要连接的服务器的主机名和端口。
(2)发送连接请求到服务器,并等待服务器的回馈信息。
(3)连接成功后,与服务器进行数据的交互。
(4)数据处理完毕后,关闭自身的Socket连接。
简单的Client/Server示例:
客户端:
服务器:
效果图:
上边的代码只是实现一个客户端访问服务器,如果要多个客户同时访问一个服务器,那么服务端的代码就要修改了:
Socket又叫做套接字,它的通信原理还是比较简单的。大致分为以下几个步骤。
服务器端的步骤如下。
(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。
ServerSocket ss = newServerSocket(port);//port 指监听端口号
(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。
(3)当完成通信后,服务器关闭与客户端的Socket连接。
客户端的步骤如下。
(1)建立客户端的Socket,确定要连接的服务器的主机名和端口。
Socket socket =new Socket(主机名,端口号); eg.//向本机的3000端口发出客户请求 Socket socket = newSocket(InetAddress.getLocalHost(),3000);
(2)发送连接请求到服务器,并等待服务器的回馈信息。
(3)连接成功后,与服务器进行数据的交互。
(4)数据处理完毕后,关闭自身的Socket连接。
客户端:
public class Client { public static void main(String[] args) { // TODOAuto-generated method stub Socketsocket = null; BufferedReader bufferedReader = null,sBufferedReader = null; PrintWriterprintWriter = null; try { //向本机的3000端口发出客户请求 socket = newSocket(InetAddress.getLocalHost(),3000); //由socket对象得到输入流,并构造相应的BufferReader 对象 bufferedReader = new BufferedReader(newInputStreamReader(socket.getInputStream())); //由socket对象得到输出流,并构造PrintWriter对象 printWriter= new PrintWriter(socket.getOutputStream()); //由系统标准输入设备构造BufferedReader对象 sBufferedReader = new BufferedReader(newInputStreamReader(System.in)); while(true){ //从系统标准输入读入一字符串 Stringstring = sBufferedReader.readLine(); printWriter.println(string); //刷新输出流,是服务器立马获得该字符 printWriter.flush(); Stringsstring = bufferedReader.readLine(); System.out.println("Server said"+sstring); if(string.equals("end")){ break; } } } catch(UnknownHostException e) { // TODOAuto-generated catch block e.printStackTrace(); } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); }finally{ if(bufferedReader != null){ try { bufferedReader.close(); } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } if(printWriter != null ) { printWriter.close(); } if (socket!= null ) { try { socket.close(); } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } } } } }}
服务器:
public class myServer { public static void main(String[] args) { // TODOAuto-generated method stub ServerSocketserverSocket = null; Socketclient = null; BufferedReader bufferedReader = null,sBufferedReader = null; PrintWriterprintWriter = null; try { //创建一个ServerSocket在端口3000监听客户请求 serverSocket= new ServerSocket(3000); //使用accept()阻塞等待客户请求 client =serverSocket.accept(); bufferedReader= new BufferedReader(newInputStreamReader(client.getInputStream())); printWriter= new PrintWriter(client.getOutputStream()); sBufferedReader = new BufferedReader(newInputStreamReader(System.in)); while (true){ Stringstring = bufferedReader.readLine(); System.out.println("Client said:"+string); printWriter.println(sBufferedReader.readLine()); printWriter.flush(); if(string.equals("end")) { break; } } } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); }finally{ if(bufferedReader != null){ try { bufferedReader.close(); } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } if(printWriter != null ) { printWriter.close(); } if(serverSocket != null ) { try { serverSocket.close(); } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } } if (client!= null) { try { client.close(); } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } } } } }}
效果图:
上边的代码只是实现一个客户端访问服务器,如果要多个客户同时访问一个服务器,那么服务端的代码就要修改了:
public class MyServerMutile extends Thread{ Socketclient; publicMyServerMutile(Socket c) { // TODOAuto-generated constructor stub this.client= c; } public voidrun() { ServerSocketserverSocket = null; Socketclient = null; BufferedReader bufferedReader = null,sBufferedReader = null; PrintWriterprintWriter = null; try { //创建一个ServerSocket在端口3000监听客户请求 serverSocket= new ServerSocket(3000); //使用accept()阻塞等待客户请求 client =serverSocket.accept(); bufferedReader= new BufferedReader(newInputStreamReader(client.getInputStream())); printWriter= new PrintWriter(client.getOutputStream()); sBufferedReader = new BufferedReader(newInputStreamReader(System.in)); while (true){ Stringstring = bufferedReader.readLine(); System.out.println("Client said:"+string); printWriter.println(sBufferedReader.readLine()); printWriter.flush(); if(string.equals("end")) { break; } } } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); }finally{ if(bufferedReader != null){ try { bufferedReader.close(); } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } if(printWriter != null ) { printWriter.close(); } if(serverSocket != null ) { try { serverSocket.close(); } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } } if (client!= null) { try { client.close(); } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } } } } }
publicstatic void main(String[] args) { // TODOAuto-generated method stub try { ServerSocketserverSocket = new ServerSocket(3000); while(true){ MyServerMutile myServerMutile = newMyServerMutile(serverSocket.accept()); myServerMutile.start(); } } catch(IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } }}
0 0
- Socket通信基础篇(一)
- socket通信基础(一)
- iOS Socket通信基础(一)
- 基于TCP/UDP的Socket网络通信系列之网络基础篇(一)
- API SOCKET基础(一) TCP建立连接并通信
- API SOCKET基础(一) TCP建立连接并通信
- API SOCKET基础(一) TCP建立连接并通信
- Socket通信编程基础__实例一__server端
- Lniux网络通信一(基础知识点+Socket模型)
- Socket通信基础
- Socket通信基础
- JAVA-Socket通信基础
- Android socket通信基础
- Socket通信基础
- 基础Socket通信
- python socket基础通信
- Socket通信基础
- SOCKET通信基础
- 中介者模式
- Android中的弹出提示框
- Java(Android)线程池
- 国家发展和改革委员会城市和…
- IBM宣布启动2014三大战略方…
- Socket通信基础篇(一)
- 使用Android Lint 优化代码
- Android 粒子 3D效果
- Java线程中带有返回值的线程Callab…
- GCC编译优化
- The connection to adb is down, and a severe error has occured解决方案.
- DB2执行Sql语句中时的with ur
- Android编译运行Native程序详解
- CentOS安装Maven