TCP网络程序设计是利用Socket类进行编写的通信程序,利用TCP协议进行通信的两个应用程序是有主次之分,一个为服务器程序,一个为客户机程序,步骤如下:
① 服务器创建一个服务端套接字(ServerSocket),使用accept()方法等待客户机连接
② 客户端创建一个Socket,请求与服务器建立连接
③ 服务端接收到了客户机的请求,同时创建一个Socket与客户机连接。
服务端套接字:在Java中ServerSocket类表示服务器套接字,主要功能是等待网络上的请求,通过指定的端口实例ServerSocket类,它将会通过指定的端口来等待连接的套接字,服务器套接字依次可以与一个套接字连接,若多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入队列中(先进先出),然后从中一个个取出与服务器套接字进行连接,当然请求连接数也是有上限的,队列默认大小是50,若请求连接数超出最大容纳数,则多出的连接请求将会被拒绝。
通信实现:当客户机的socket与服务器的socket相连接后,客户机调用socket的getOutputStream()获取的输出流将指向服务器调用socket的getInputStream()方法的输入流反之亦然。
代码实现(单向通信)(java):
服务器端:
① 声明字段
private BufferedReader reader; //用于读取流(客户机传递的数据)
private ServerSocket server; //服务器套接字
private Socket socket; //套接字
② 服务器通过端口8080(自定义)创建服务器套接字,调用accept()方法等待客户机请求
void getserver(){
try {
server = new ServerSocket(8080); //实例化ServerSocket对象
System.out.println("套接字创建成功");
while (true) {
System.out.println("等待客户机连接");
socket = server.accept(); //客户机请求,服务端创建套接字与其连接获取socket对象
System.out.println("连接完成");
getClientMsg();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
③服务器得到客户机的请求,进行连接获取到socket对象,获取客户机数据转化为输入流,在将其转化为输出流,打印出来,并且关闭相应的流和套接字。
private void getClientMsg() {
try {
//打印 客户端数据
System.out.println("客户机" + reader.readLine());
} catch (Exception e) {
// TODO: handle exception
} finally {
try {
if (reader != null) {
reader.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
④启动调用
public static void main(String[] args) {
FWQ fwq = new FWQ();
fwq.getserver();
}
客户机:
①声明字段
private static Socket socket; //客户机套接字
private static PrintWriter writer; //用于客户机写入数据传输到服务器
②创建套接字,传入IP与端口进行请求连接得到套接字,向套接字写入数据
public static void main(String[] args) {
try {
System.out.println("尝试连接");
socket = new Socket("127.0.0.1",8080);
System.out.println("完成连接");
writer = new PrintWriter(socket.getOutputStream(),true);
writer.println("aaa");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出:
服务器:
客户机: