Socket网络编成是一种较为底层的网络数据传输,很多语言都支持。
本例是根据菜鸟教程中的Java网络编程而写。
详细内容参考请参考:http://www.runoob.com/java/java-networking.html
Socket 编程
套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。
当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。
java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
-
服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
-
服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
-
服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
-
Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
-
在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。
TCP 是一个双向的通信协议,因此数据可以通过两个数据流在同一时间发送.以下是一些类提供的一套完整的有用的方法来实现 socket。
客户端代码:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
String serverName = args[0];
int port = Integer.parseInt(args[1]);
try {
System.out.println("连接到主机:" + serverName + ",端口号:" + port);
Socket clientSocket = new Socket(serverName, port);
System.out.println("远程主机地址为:" + clientSocket.getRemoteSocketAddress());
// 创建客户端输出流,用于向服务器发送数据
OutputStream outToServer = clientSocket.getOutputStream();
// 将输出流转换为数据输出流
DataOutputStream out = new DataOutputStream(outToServer);
// 采用数据输出流的writeUTF()方法向服务器发送数据
out.writeUTF("Hello from" + clientSocket.getLocalSocketAddress());
// 创建客户端输入流,用于向接收来自服务的数据流
InputStream inFromServer = clientSocket.getInputStream();
// 将输入流转换为数据输入流
DataInputStream in = new DataInputStream(inFromServer);
// 读来自服务器的数据
System.out.println("服务器响应:" + in.readUTF());
// 关闭服务器套接字
clientSocket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
服务器端代码:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class Server extends Thread{
// Server类有一个私有的serverSocket对象引用,用于与客户端链接
private ServerSocket serverSocket;
// 构造函数,初始化serverSocket
public Server(int port) throws IOException{
// 创建一个ServerSocket对象,绑定到本地port数值表示的端口
serverSocket = new ServerSocket(port);
// 设置服务器超时时间为10000毫秒
serverSocket.setSoTimeout(10000);
}
// 主功能模块
public void run() {
while(true) {
try {
System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
// 等待客户端连接
Socket server = serverSocket.accept();
// 执行到这时,客户端已成功连接,打印客户端socket地址
System.out.println("远程主机地址:" + server.getRemoteSocketAddress() );
// 创建数据输入流,接收来自客户端的数据
DataInputStream in = new DataInputStream(server.getInputStream());
// 打印接受的数据
System.out.println(in.readUTF());
// 创建数据输出流
DataOutputStream out = new DataOutputStream(server.getOutputStream());
// 通过数据输出流,向客户端的发送数据
out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGood bye!");
server.close();
}catch(SocketTimeoutException ste) {
System.out.println("Socket timed out!");
break;
}catch(IOException ioe) {
ioe.printStackTrace();
break;
}
}
}
// 程序入口
public static void main(String[] args) {
int port = Integer.parseInt(args[0]);
try {
Thread t = new Server(port);
t.run();
}catch(IOException ioe) {
ioe.printStackTrace();
}
}
}