Java中通过TCP协议发送和接收数据-Socket编程
2016-02-18 15:14
881 查看
TCP
TCP协议是面向连接、保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。
TCP通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。
对socket的本身组成倒是比较好理解。既然是应用通过socket通信,肯定就有一个服务器端和一个客户端。所以它必然就包含有一个对应的IP地址。另外,在这个地址上server要提供一系列的服务,于是就需要有一系列对应的窗口来提供服务。所以就有一个对应的端口号(Port)。
Socket服务端
Server端所要做的事情主要是建立一个通信的端点,然后等待客户端发送的请求。典型的处理步骤如下:
1. 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。
2.重复如下几个步骤:
a. 调用socket的accept()方法来获得客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接。
b.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。
c.结束的时候调用socket实例的close()方法关闭socket连接。
服务端示例代码:
Socket客户端
客户端的请求过程稍微有点不一样:
1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。
2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。
3.操作结束后调用socket实例的close方法,关闭。
服务端示例代码:
运行测试:
先运行服务端代码,之后运行客户端。
之后可以分别在客户端和服务端看到对应的消息。
TCP协议是面向连接、保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。
TCP通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。
Socket
Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据。根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的。对socket的本身组成倒是比较好理解。既然是应用通过socket通信,肯定就有一个服务器端和一个客户端。所以它必然就包含有一个对应的IP地址。另外,在这个地址上server要提供一系列的服务,于是就需要有一系列对应的窗口来提供服务。所以就有一个对应的端口号(Port)。
Socket服务端
Server端所要做的事情主要是建立一个通信的端点,然后等待客户端发送的请求。典型的处理步骤如下:
1. 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。
2.重复如下几个步骤:
a. 调用socket的accept()方法来获得客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接。
b.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。
c.结束的时候调用socket实例的close()方法关闭socket连接。
服务端示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public class TestTCPSend { public static void main(String[] args) { ServerSocket serverSocket=null; Socket socket=null; String msg="hello client,I am server.."; try { //构造ServerSocket实例,指定端口监听客户端的连接请求 serverSocket=new ServerSocket(8080); //建立跟客户端的连接 socket=serverSocket.accept(); //向客户端发送消息 OutputStream os=socket.getOutputStream(); os.write(msg.getBytes()); InputStream is=socket.getInputStream(); //接受客户端的响应 byte[] b=new byte[1024]; is.read(b); System.out.println(new String(b)); } catch (IOException e) { e.printStackTrace(); } finally { //操作结束,关闭socket try { serverSocket.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } |
客户端的请求过程稍微有点不一样:
1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。
2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。
3.操作结束后调用socket实例的close方法,关闭。
服务端示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class TestTCPReceive { public static void main(String[] args) { Socket socket=null; try { //对服务端发起连接请求 socket=new Socket("localhost", 8080); //接受服务端消息并打印 InputStream is=socket.getInputStream(); byte b[]=new byte[1024]; is.read(b); System.out.println(new String(b)); //给服务端发送响应信息 OutputStream os=socket.getOutputStream(); os.write("yes,I have received you message!".getBytes()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
先运行服务端代码,之后运行客户端。
之后可以分别在客户端和服务端看到对应的消息。
相关文章推荐
- iOS-使用NSURLConnection进行Http Get和Post请求网络数据
- HTTPhttp请求
- 创建本地yum源-http方式
- App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. 问题
- 多线程环境下调用 HttpWebRequest 并发连接限制
- JavaWeb:报错The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- HTTP笔记
- linux服务器TCP并发连接数优化
- linux服务器TCP并发连接数优化
- 2016太原网络营销师开讲百度竞价(SEM)优化从哪些角度考虑?
- 网络路由基础认识
- 匿名突破网络限制 (Tor工作原理分析)
- java-httpclient-HTTPS请求
- 使用Python来编写HTTP服务器的超级指南
- Linux TCP
- 使用Eclipse进行远程调试(原文http://blog.csdn.net/sunyujia/article/details/2614614)
- http url转义字符,特殊字符
- RESTEasy中的HTTP异步处理(下)
- Exception in thread "http-bio-8080-exec-2" java.lang.OutOfMemoryError: PermGen space[解决方案]
- 基于神经网络的人脸识别算法的优缺点