如何开发一个Server-Client模型的程序
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
服务器端
package com.anqi.tcp;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//1.创建服务器 指定端口
//ServerSocket(int port) 创建绑定到特定端口的服务器套接字
ServerSocket server = new ServerSocket(8888);
//2.接收客户端连接 阻塞式
Socket socket = server.accept();
System.out.println("与一个客户端建立连接");
//3.发送数据
String msg = "这是服务器发送的数据";
//4.输出流
/*
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
bw.write(msg);
bw.newLine();
bw.flush();*/
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(msg);
dos.flush();
//void writeUTF(String str)
//以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
//不用关闭连接,因为一般服务器都是不间断运行
}
}
客户端
package com.anqi.tcp;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client {
//先运行客户端会报错,因为没有与之建立连接的服务器
public static void main(String[] args) throws IOException {
//1.创建客户端
//此类实现客户端套接字(也可以就叫“套接字”)。
//套接字是两台机器间通信的端点
//Socket(String host, int port)
// 创建一个流套接字并将其连接到指定主机上的指定端口号
Socket socket = new Socket("localhost",8888);
//2.接收数据
/*
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String str = br.readLine(); //阻塞式方法,如果没有newline会报异常
System.out.println(str);
*/
DataInputStream dis = new DataInputStream(socket.getInputStream());
String msg = dis.readUTF();
System.out.println(msg);
}
}