网络编程是一门很流行,也是很基本的技术,我们一般直接使用框架来实现网络编程,很少会直接写底层的通讯代码,我们有必要知道客户端究竟是怎么样服务器进行通讯的。我们来看一个简单的实例,就是客户端请求的时候,服务器把时间发到客户端。
第一步:编写服务器端代码。
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
//服务器
public class DateServer {
public final static int portNumber = 4219; //端口号
public DateServer() throws IOException {
//创建绑定到特定端口的服务器套接字
ServerSocket serverSocket = new ServerSocket(portNumber);
while (true) {
System.out.println("Waiting for a client");
//侦听并接受到此套接字的连接
Socket socket = serverSocket.accept();
System.out.println("Got a client, send a message");
OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
String message = "Current date and time is " + new Date() + "\n";
out.write(message);
out.close();
}
}
public static void main(String[] args) {
try {
DateServer dateServer = new DateServer();
}catch(Exception e) {
e.printStackTrace();
}
}
}
第二步:编写客户端代码,打印服务器的时间。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.InetAddress;
import java.net.Socket;
//客户机
public class DateClient {
public final static int portNumber = 4219; //端口号
public DateClient() throws IOException {
//创建一个流套接字并将其连接到指定 IP 地址的指定端口号
Socket socket = new Socket(InetAddress.getLocalHost() ,portNumber);
//返回此套接字的输入流
Reader reader = new InputStreamReader(socket.getInputStream());
BufferedReader input = new BufferedReader(reader);
System.out.println("message is '" + input.readLine() + "'");
}
public static void main(String[] args) {
try {
DateClient dateClient = new DateClient();
}catch(Exception e) {
e.printStackTrace();
}
}
}
总结:套接字是网络通讯的必要部分,套接字由ip地址和端口号组成,通过套接字也可以得到输入流和输出流。运行程序顺序为:先运行服务器端代码,然后运行客户端代码。