TCP传输

使用TCP进行数据传输

传输思路:TCP传输分为客户端和服务端,其中客户端对应的对象为Socket,服务端对应的对象为ServerSocket

客户端
import java.io.*;
import java.net.*;
public class TCPUser {
    public static void main(String [] args) throws Exception{
        //创建Socket服务,并指定要连接的主机和端口
        Socket s=new Socket("本机IP",10003);
        //向服务端发送数据,应该获取Socket流中的输出流
        OutputStream out = s.getOutputStream();
        out.write("Hello,ni hao!".getBytes());
        out.close();
    }
}
服务端
import java.io.*;
import java.net.*;
public class TCPserver {
    public static void main(String [] args) throws Exception{
        ServerSocket ss=new ServerSocket(10003);
        //获取连接过来的客户端对象,通过ServerSocket的accept()方法,是一个阻塞式方法
        Socket s_1=ss.accept();
        //客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端
        //的对象的读取发过来的数据并打印在控制台
        byte [] buf=new byte[1024];
        InputStream in=s_1.getInputStream();
        int len=in.read(buf);
        InetAddress ad=s_1.getInetAddress();
        
        System.out.println(ad.getHostAddress()+"::"+new String(buf,0,len));
        s_1.close(); 
        ss.close();
    }
}

注意:Socket的构造方法的描述:创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 也就是说该端口就是服务端的端口

小练习以及改进

客户端向服务端发送一条字符串,服务端返回该字符串的大写格式

public class TCPlianxiUser {

    public static void main(String[] args) throws Exception {
        Socket s = new Socket("本机IP", 10004);
        OutputStream outofu = s.getOutputStream();
        InputStream inofu = s.getInputStream();
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in, "GBK"));
        while (true) {
            String str = buf.readLine();
            if ("over".equals(str)) {
                outofu.write(null);
                outofu.close();
                inofu.close();
                break;
            }
            outofu.write(str.getBytes("GBK"));
            byte[] bufofin = new byte[1024];
            int len = inofu.read(bufofin);
            System.out.println(new String(bufofin, 0, len, "GBK"));
        }
        s.close();
    }
}
public class TCPlianxiServer {

    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(10004);
        Socket user = ss.accept();
        InputStream inofser = user.getInputStream();
        OutputStream outofser = user.getOutputStream();
        byte[] bufofser = new byte[1024];
        while (true) {
            int len = inofser.read(bufofser);
            String newstr = new String(bufofser, 0, len,"GBK");
            InetAddress ip=user.getInetAddress();
            System.out.println(ip.getHostAddress()+"::"+newstr);
            newstr = newstr.toUpperCase();
            outofser.write(newstr.getBytes("GBK"));
        }
    }
}

可以看到使用字节流比较麻烦

改进(使用打印流)
import java.io.*;
import java.net.*;
public class TCPlianUserPlus {
    public static void main(String [] args) throws Exception{
        Socket s=new Socket("本机IP",10004);
        PrintStream pofu=new PrintStream(s.getOutputStream(),true,"GBK");
        BufferedReader inofu=new BufferedReader(new InputStreamReader(s.getInputStream(),"GBK"));
        BufferedReader inofkey=new BufferedReader(new InputStreamReader(System.in,"GBK"));
        while(true){
            String str=inofkey.readLine();
            if("exit".equals(str)){
                pofu.println("exit");
                break;
            }
            pofu.println(str);
            String strofser = inofu.readLine();
            System.out.println(strofser);
        }
        s.close();
    }
}
import java.io.*;
import java.net.*;
public class TCPlianServerplus {
    public static void main(String [] args) throws Exception{
        ServerSocket ss=new ServerSocket(10004);
        Socket user=ss.accept();
        BufferedReader inofser=new BufferedReader(new InputStreamReader(user.getInputStream(),"GBK"));
        PrintStream pofser=new PrintStream(user.getOutputStream(),true,"GBK");
        while(true){
            String str=inofser.readLine();
            if("exit".equals(str))
                break;
            pofser.println(str.toUpperCase());
        }
    }
}

采用打印流之后明显简化了很多

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。