计算机网络是不同终端相互传输信息的途径,自顶向下分为七个层次:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer),在计算机网络socket编程中,属于传输层。
计算机网络编程通过调用socket的API实现信息传输,而更底层的传输过程还有更详细的学科进行学习。本文旨在讲解基于Java的socket编程。
既然是消息的传输,信息的交换,就必须要有交流的对象,因此,第一个对象我们叫做服务器server,第二个叫做客户端client。
首先是客户端的程序编写,本次代码基于这个框架
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
public static void main(String[] args) {
try{
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
然后就可以在try的语句中添加自己需要的内容
首先创建一个ServerSocket类,并制定port number,这是一个监听器listener线程,负责监听请求连接的客户端。注意,端口号码有一定的限制,一些特殊号码的是已被计算机中的其他程序所使用的。
// open a server listener to listen to connection from client
ServerSocket client_listener = new ServerSocket(18888);
System.out.println("Listening, the IP address is: " + client_listener.getInetAddress());
当服务器server监听到客户端请求连接的申请后,就会建立一个socket连接
// when a client apply to connecting, create and allocate a socket to the client
Socket connection_socket = client_listener.accept();
System.out.println("Listened a connection");
System.out.println("The client IP address is: "+ connection_socket.getInetAddress());
System.out.println("The client Port number is: "+ connection_socket.getPort());
在完成连接的建立之后,服务器想要和客户端发送信息,就会生成一个管道来发送信息,即创建一个输出信息流的对象,并尝试发送信息。这里的flush是一个刷新和立即强制发送的作用。
// create a channel to send message
OutputStream message_send = connection_socket.getOutputStream();
// when sending an integer, the number just in the range of (0, 255)
int send_num1 = 123;
message_send.write(send_num1);
message_send.flush(); // optional, refresh and force to send message immediately
System.out.println("Message sent successfully, content is: ");
System.out.println(send_num1);
这时,我们最简单的服务器代码框架就基本完成了。
接下来就是一个客户端的代码框架,与服务器代码类似。
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class client1 {
public static void main(String[] args) {
try {
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
接下来就是申请连接,首先要知道服务器的host number和port number
// create a new socket to connect server
Socket client = new Socket("0.0.0.0", 18888);
System.out.println("connecting..." );
System.out.println("The client local port is: " + client.getLocalPort());
System.out.println("Connected, start to communication");
在连接之后,要接收服务器发来的消息,创建一个接收消息的管道
// create a channel to receive a message from server
InputStream message_received = client.getInputStream();
并对消息进行读取
// get an integer message from server
int receive_int = message_received.read();
System.out.println("Received a message from server, content:");
System.out.println(receive_int);
这样,最简单的服务器代码框架也就完成了。
注意,在运行客户端代码之前,要先运行服务器代码启动监听,否则会报错;此外,socket和信息流的管道最后要用.close关闭。