JAVA——网络编程(2):Java编写的TCP网络程序

来源:互联网 发布:台湾ptt评论知乎文章 编辑:程序博客网 时间:2024/05/22 10:44

1. 基于TCP协议的网络应用程序的交互过程

1.1 交互过程

  • (1)服务器程序创建一个ServerSocket,然后调用accept方法等待客户连接;
  • (2)客户端程序创建一个Socket,并请求与服务器建立连接;
  • (3)服务器接收客户端的连接请求,并创建一个新的Socket与该客户建立专线连接;
  • (4)在步骤(2)(3)中建立了连接的两个Socket在一个单独的线程(有服务器创建)上对话;
  • (5)服务器开始等待新的连接请求。

1.2 过程流图

这里写图片描述

2. 服务器ServerSocket

  • 编写TCP网络服务器程序时,首先要用到java.net.ServerSocket类,用以创建服务器的Socket,此Socket通过ServerSocket调用accept方法即可返回一个Socket。
  • ServerSocket构造方法与描述 :
ServerSocket() throws IOExceptionServerSocket(int port) throws IOExceptionServerSocket(int port, int backlog) throws IOExceptionServerSocket(int port, int backlog, InetAddress bindAddr)   throws IOException

3. 客户端Socket

  • 客户端要与服务器建立连接,客户端首先必须创建一个Socket对象。
  • Socketet构造方法与描述 :
  Socket()   Socket(InetAddress address, int port)   Socket(InetAddress host, int port, boolean stream)   Socket(InetAddress address, int port, InetAddress localAddr, int localPort)   Socket(String host, int port, InetAddress localAddr, int localPort) 
  • Java提供了Socket.getInputStream方法返回Socket的输入流对象,Socket.getOutputStream方法返回Socket的输出流对象。

4. TCP服务器和客户端程序模型

4.1 TCP服务器程序模型的编写要点

这里写图片描述

4.2 TCP网络程序实例

  • (1)实现的功能
    这里写图片描述

  • (2)TCP服务器端的代码示例

import java.io.*;import java.net.*;public class  TcpClient{    public static void main(String[] args)     {        try{        if(args.length < 2){            System.out.println("Usage:java TcpClient ServerIP ServerPort.");            return;        }           Socket s = new Socket(args[0],Integer.parseInt(args[1]));//Socket s = new Socket("202.117.131.7",8001);        InputStream ips = s.getInputStream();        OutputStream ops = s.getOutputStream();        BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));        BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));        DataOutputStream dos = new DataOutputStream(ops);        while(true){            String strWord = brKey.readLine();            dos.writeBytes(strWord + System.getProperty("line.separator"));            if(strWord.equalsIgnoreCase("quit"))                break;            else                System.out.println(brNet.readLine());        }        dos.close();        brKey.close();        brNet.close();        s.close();        }catch(Exception e){            e.printStackTrace();        }    }}
  • (3)TCP客户端的代码示例
import java.io.*;import java.net.*;class Servicer implements Runnable{    Socket s;    public Servicer(Socket s)    {        this.s = s;    }    public void run()     {        try{        InputStream ips = s.getInputStream();        OutputStream ops = s.getOutputStream();        BufferedReader br = new BufferedReader(new InputStreamReader(ips));        DataOutputStream dos = new DataOutputStream(ops);        while(true)        {            String strWord = br.readLine();            System.out.println(strWord + ":" + strWord.length());            if(strWord.equalsIgnoreCase("quit"))                break;            String strEcho = (new StringBuffer(strWord).reverse()).toString();            dos.writeBytes(strWord + "--->" + strEcho + System.getProperty("line.separator"));        }        br.close();        dos.close();        s.close();        }catch(Exception e)        {            e.printStackTrace();        }    }}public class TcpServer {    public static void main(String[] args) throws IOException    {        boolean bRunning = true;        ServerSocket ss = new ServerSocket(8001);        while(bRunning)        {            Socket s = ss.accept();            new Thread(new Servicer(s)).start();        }        ss.close();    }}

4.3 编译,运行:

  • 编译和运行的步骤
    (1)首先同时编译两个文件;
    (2)先单独运行服务器程序;
    (3)然后在新打开的命令窗口运行客户端程序(在(2)中运行服务器程序之前输入start即可打开新的CMD窗口);

  • 结果:
    这里写图片描述
    这里写图片描述

原创粉丝点击