Java Socket-03 Java TCP Socket,
Java Socket-03 Java TCP Socket,
Java 为 TCP 协议提供了两个类: Socket 类和 ServerSocket 类。 一个 Socket 实例代表了TCP 连接的一端。 一个 TCP 连接 ( TCP connec ti on ) 是一条抽象的双向信道, 两端分别由 IP地址和端口号确定。 在开始通信之前, 要建立一个 TCP 连 接, 这需要先由客户端 TCP 向服务器端 TCP 发送连接请求。 ServerSocket 实例则 监听 TCP 连 接请求,并为每个请求创建新的 Socket 实 例。也就是说,服务器端要同时处理 ServerSocket 实例 和 Socket 实例, 而客户端只需要使用 Socket 实例 。
典型的 TCP 客户端要经过下面三步:
1.创建一个 Socket 实例: 构造器向指定的远程主机和端口建立一个 TCP 连接。
2. 通过套接字的输入输出流(I/O streams)进行通信:一个 Socket 连接实例包括一个InputStream 和一个 OutputStream,它们的用法同于其他 Java 输入输出流。
3. 使用 Socket 类的 close()方法关闭连接。
典型的 TCP 服务器有如下两步工作:
1. 创建一个 ServerSocket 实例并指定本地端口。此套接字的功能是侦听该指定端口收到的连接。
2. 重复执行:
a. 调用 ServerSocket 的 accept() 方法以获取下一个客户端连接。基于新建立的客户端连接,创建一个 Socket 实例,并由 accept() 方法返回。
b. 使用所返回的 Socket 实例的 InputStream 和 OutputStream 与客户端进行通信。
c. 通信完成后,使用 Socket 类的 close() 方法关闭该客户端套接字连接。
客户端代码:
package com.iteye.xuj.socket;
import java.net.Socket;
import java.net.SocketException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TestClient {
public static void main(String[] args) throws IOException {
// 地址、数据、端口
String server = "127.0.0.1";
byte[] data = "测试数据".getBytes();
int servPort = 7;
// 创建TCP套接字
Socket socket = new Socket(server, servPort);
System.out.println("Connected to server...sending echo string");
// 获取套接字的输入输出流
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
// 发送字符串到回馈服务器
out.write(data);
// 从回馈服务器接受回馈信息
int totalBytesRcvd = 0;
int bytesRcvd;
while (totalBytesRcvd < data.length) {
if ((bytesRcvd = in.read(data, totalBytesRcvd, data.length - totalBytesRcvd)) == -1)
throw new SocketException("Connection closed prematurely");
totalBytesRcvd += bytesRcvd;
}
System.out.println("Received: " + new String(data));
// 关闭套接字
socket.close();
}
}
服务器端代码
package com.iteye.xuj.socket;
import java.net.*;
import java.io.*;
public class TestServer {
private static final int BUFSIZE = 32;
public static void main(String[] args) throws IOException {
//端口号
int servPort = 7;
//创建服务器端套接字,servSock侦听特定端口号上的客户端连接请求
ServerSocket servSock = new ServerSocket(servPort);
int recvMsgSize;
byte[] receiveBuf = new byte[BUFSIZE];
//永久循环,迭代处理新的连接请求
while (true) {
//接受新的连接请求
Socket clntSock = servSock.accept();
//报告已连接的客户端
SocketAddress clientAddress = clntSock.getRemoteSocketAddress();
System.out.println("Handling client at " + clientAddress);
//获取套接字的输入输出流
InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();
//接收并复制数据,直到客户端关闭
while ((recvMsgSize = in.read(receiveBuf)) != -1) {
out.write(receiveBuf, 0, recvMsgSize);
}
//关闭客户端套接字
clntSock.close();
}
}
}
直接运行客户端输出如下:
Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:189)
at com.iteye.xuj.socket.TestClient.main(TestClient.java:18)
先运行服务器端,再运行客户端:
服务器端输出如下:
Handling client at /127.0.0.1:24635
客户端输出如下:
Connected to server...sending echo string
Received: 测试数据
相关文章
- 暂无相关文章
用户点评