网络通信--TCP

本文深入探讨了服务器端与客户端的交互过程,重点介绍了使用TCP协议进行网络连接的方法。通过实例展示了如何利用Java的InetAddress类获取本地主机地址,以及如何实现基于C-S方式的服务器和客户端交互。详细阐述了服务器端如何创建ServerSocket监听连接请求,以及客户端如何通过Socket发起连接。此外,文章还介绍了如何利用线程技术优化C-S交互效率,并提供了完整的代码示例,以便读者更好地理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器端与客户端的交互

这里写图片描述

①服务器程序创建一个ServerSocket套接字,调用accept()方法等待客户机来连接
②客户端程序创建一个Socket,请求与服务器建立连接
③服务器接收客户机的连接请求,同时创建一个新的Socket与客户建立连接.服务器继续等待新的连接请求.

网络连接(TCP协议)

InetAddress(api InetAddress),没有构造方法

    try {
    //不能直接new一个对象,用getLocalHost()取得对象
        InetAddress address=InetAddress.getLocalHost();
        System.out.println(address.getHostName());
        System.out.println(address.getHostAddress());
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

C–S方式(api ServerSocket)

运行时先运行服务器代码,在运行客户端代码
在eclipse下面窗口可查看两个控制台的信息

//服务器代码
public static void main(String[] args) {
    try {
        System.out.println("服务器运转");
        ServerSocket server=new ServerSocket(8080);
        Socket socket=server.accept();//开启服务,等待连接
        InputStream is=socket.getInputStream();//获得socket输入流
        InputStreamReader isr=new InputStreamReader(is);
        BufferedReader br=new BufferedReader(isr);
        String str=br.readLine();
        System.out.println("在等待"+str);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
//客户端代码
public static void main(String[] args) {
    try {

        Socket socket=new Socket("192.168.0.191",8080);
        System.out.println("客户端启动");
        OutputStream os=socket.getOutputStream();
        OutputStreamWriter osw=new OutputStreamWriter(os);
        BufferedWriter bw=new BufferedWriter(osw);
        bw.write("hello\n");
        bw.flush();
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

C–S交互访问

//服务器代码
public static void main(String[] args) {
    try {
        System.out.println("服务器运转");
        ServerSocket server=new ServerSocket(8080);
        Socket socket=server.accept();
        InputStream is=socket.getInputStream();
        InputStreamReader isr=new InputStreamReader(is);
        OutputStream os=socket.getOutputStream();
        OutputStreamWriter osw=new OutputStreamWriter(os);
        BufferedWriter bw=new BufferedWriter(osw);
        BufferedReader br=new BufferedReader(isr);
        Scanner input=new Scanner(System.in);
        while(true){
        String str=br.readLine();//等待客户端
        System.out.println("在等待"+str);
        String s=input.next();
        bw.write(s+"\n");
        bw.flush();
        String str1=br.readLine();//等待客户端
        System.out.println("在等待"+str1);

        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
//客户端代码
public static void main(String[] args) {
    try {
        Socket socket=new Socket("192.168.0.191",8080);
        InputStream is=socket.getInputStream();
        InputStreamReader isr=new InputStreamReader(is);
        BufferedReader br=new BufferedReader(isr);
        OutputStream os=socket.getOutputStream();
        OutputStreamWriter osw=new OutputStreamWriter(os);
        BufferedWriter bw=new BufferedWriter(osw);
        Scanner input=new Scanner(System.in);
        while(true){
            String s=input.next();
            bw.write(s+"\n");
            bw.flush();
            String sr=br.readLine();
            System.out.println("服务端返回"+sr); 
        }
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

利用线程来实现C-S来交互

//*******************读线程*********************
public class MyRead implements Runnable {
    private Socket socket;

    public MyRead(Socket socket) {// 构造器
        this.socket = socket;
    }

    // @Override
    // public void run() {
    // BufferedReader br = null;
    // try {
    // InputStream is = socket.getInputStream();
    // br = new BufferedReader(new InputStreamReader(is));
    // while (true) {
    //
    // String line = br.readLine();
    // System.out.println("说了:"+"\t" + line);
    // } }catch (IOException e) {
    // // TODO Auto-generated catch block
    // e.printStackTrace();
    // }
    //
    // }
    // }

    @Override
    public void run() {
        BufferedReader br = null;
        try {
            InputStream is = socket.getInputStream();
            br = new BufferedReader(new InputStreamReader(is));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        while (true) {

            try {
                String line = br.readLine();
                System.out.println("说了:" + "\t" + line);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

}
//******************写线程****************
public class MyWrite implements Runnable {
    private Socket socket;

    public MyWrite(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        BufferedWriter bw = null;
        try {
            OutputStream os = socket.getOutputStream();
            bw = new BufferedWriter(new OutputStreamWriter(os));

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Scanner input = new Scanner(System.in);
        while (true) {
            String words = input.next();
            try {
                bw.write(words + "\n");
                bw.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

}
//*****************服务器端****************
public class MyServer {
    public static void main(String[] args) {
        try {
            ServerSocket server= new ServerSocket(8080);
            System.out.println("服务器启动");
            Socket socket=server.accept();//等待客户端连接进入
            System.out.println("有客户端进来");
            MyRead mr=new MyRead(socket);
            MyWrite mw=new MyWrite(socket);
            Thread t = new Thread(mr);
            Thread t1= new Thread(mw);
            t.start();
            t1.start();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
//*******************客户端*******************
public class MyClient {
    public static void main(String[] args) {
        try {
    System.out.println("客户端连接");
 Socket socket = new Socket("192.168.0.191", 8080);
// Thread read = new Thread(new MyRead(socket));
// Thread write = new Thread(new MyWrite(socket));
// read.start();
// write.start();
 MyRead mr=new MyRead(socket);
    MyWrite mw=new MyWrite(socket);
    Thread t = new Thread(mr);
    Thread t1= new Thread(mw);
    t.start();
    t1.start();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值