java网络编程-TCP

TCP编程

TCP协议:有链接、保证可靠的无误差通讯

  • 服务器:创建一个ServerSocket,等待连接
  • 客户机:创建一个Socket,连接到服务器
  • 服务器:ServerSocket接收到连接,创建一个Socket和客户的Socket建立专线连接,后续服务器和客户机的对话(这一对Socket)会在一个单独的线程(服务器端)上运行
  • 服务器的ServerSocket继续等待连接,返回 1

在这里插入图片描述
ServerSocket:服务器码头

  • 需要绑定port
  • 不指定IP地址,默认本机。如果有多块网卡,需要绑定一个IP地址

Socket:运输通道

  • 客户端需要绑定服务器的地址和Port
  • 客户端往Socket输入流写入数据,送到服务端
  • 客户端从Socket输出流取服务器端过来的数据
  • 服务端反之亦然

TCP

  • 服务端等待响应时,处于阻塞状态
  • 服务端可以同时响应多个客户端
  • 服务端每接受一个客户端,就启动一个独立的线程与之对应
  • 客户端或者服务端都可以选择关闭这对Socket的通道

单线程服务程序

server源代码:

package com.lihuan.network.demo02;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) {
        try {
            //创建ServerSocket驻守8001端口
            ServerSocket ss = new ServerSocket(8001);
            //等待阻塞
            Socket s = ss.accept();
            System.out.println("welcome to java world");
            //定义通道输入流、输出流
            InputStream ips = s.getInputStream();
            OutputStream ops = s.getOutputStream();
            //同一个通道,服务端的输出流就是客户端的输入流,服务端的输入流就是客户端的输出流

            ops.write("Hello, Client!".getBytes()); //输出一句话给客户端

            BufferedReader br = new BufferedReader(new InputStreamReader(ips));
            //从客户端读取一句话
            System.out.println("Client said: " + br.readLine());

            ips.close();
            ops.close();
            s.close();
            ss.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

client源代码:

package com.lihuan.network.demo02;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) {
        try {
            //创建Socket连接服务器
            Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8001);
            //定义通道输入流、输出流
            InputStream ips = s.getInputStream();
            BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));

            OutputStream ops = s.getOutputStream();
            DataOutputStream dos = new DataOutputStream(ops);

            //定义键盘的输入流
            BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
            while(true){
                String strWord = brKey.readLine();
                if(strWord.equalsIgnoreCase("quit")){
                    break;
                }else{
                    System.out.println("I want to send: " + strWord);
                    dos.writeBytes(strWord + System.getProperty("line.separator"));

                    System.out.println("Server said: " + brNet.readLine());
                }
            }

            dos.close();
            brNet.close();
            ops.close();
            ips.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

多线程服务程序

server源代码:

package com.lihuan.network.demo02;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer2 {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(8001);
            while (true){
                Socket s = ss.accept();
                System.out.println("来了一个client");
                new Thread(new Worker(s)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

worker源代码(实现Runnable接口)

package com.lihuan.network.demo02;

import java.io.*;
import java.net.Socket;

public class Worker implements Runnable {
    Socket s;

    public Worker(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        try {
            System.out.println("服务人员已启动");
            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("client said: " + strWord + ":" + strWord.length());
                if(strWord.equalsIgnoreCase("quit")){
                    break;
                }
                String strEcho = strWord + "666";
                System.out.println("server said: " + strWord + "---->" + strEcho);
                dos.writeBytes(strWord + "---->" + strEcho + System.getProperty("line.separator"));
            }
            br.close();
            dos.close();
            ips.close();
            ops.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

client源代码:

package com.lihuan.network.demo02;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) {
        try {
            //创建Socket连接服务器
            Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8001);
            //定义通道输入流、输出流
            InputStream ips = s.getInputStream();
            BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));

            OutputStream ops = s.getOutputStream();
            DataOutputStream dos = new DataOutputStream(ops);

            //定义键盘的输入流
            BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
            while(true){
                String strWord = brKey.readLine();
                if(strWord.equalsIgnoreCase("quit")){
                    break;
                }else{
                    System.out.println("I want to send: " + strWord);
                    dos.writeBytes(strWord + System.getProperty("line.separator"));

                    System.out.println("Server said: " + brNet.readLine());
                }
            }

            dos.close();
            brNet.close();
            ops.close();
            ips.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值