欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java 中模拟TCP传输的客户端和服务端实例详解

程序员文章站 2024-03-02 20:14:52
一、创建tcp传输的客户端 1、建立tcp客户端的socket服务,使用的是socket对象,建议该对象一创建就明确目的地,即要连接的主机; 2、如果连接建立成功...

一、创建tcp传输的客户端

1、建立tcp客户端的socket服务,使用的是socket对象,建议该对象一创建就明确目的地,即要连接的主机;

2、如果连接建立成功,说明数据传输通道已建立,该通道就是socket流,是底层建立好的,既然是流,说着这里既有输入流,又有输出流,想要输入流或者输出流对象,可以通过socket来获取,可以通过getoutputstream()和getinputstream()来获取;

3、使用输出流,将数据写出;

4、关闭socket服务。

import java.io.ioexception;
import java.io.outputstream;
import java.net.socket;

public class client {
  public static void main(string[] args) throws ioexception {

    // 1、创建客户端的socket服务
    socket socket = new socket("192.168.1.100", 10002);

    // 2、获取socket流中输入流
    outputstream out = socket.getoutputstream();

    // 3、使用输出流将指定的数据写出去
    out.write("tcp is coming !".getbytes());

    // 4、关闭socket服务
    socket.close();
  }
}

二、创建tcp传输的服务端

1、建立tcp服务端的的socket服务,通过serversocket对象;

2、服务端必须对外提供一个端口,否则客户端无法连接;

3、获取连接过来的客户端对象;

4、通过客户端对象来获取socket流,读取客户端发来的数据;

5、关闭资源,关客户端,关服务端。

import java.io.ioexception;
import java.io.inputstream;
import java.net.serversocket;
import java.net.socket;

public class server {
  public static void main(string[] args) throws ioexception {

    // 1、创建客户端对象
    serversocket ss = new serversocket(10002);

    // 2、获取连接过来的客户端对象
    socket s = ss.accept();

    string ip = s.getinetaddress().gethostaddress();

    // 3、通过socket对象获取输入流,读取客户端发来的数据
    inputstream in = s.getinputstream();

    byte[] buf = new byte[1024];

    int len = in.read(buf);
    string text = new string(buf, 0, len);
    system.out.println(ip + ":" + text);

  // 4、关闭资源
    s.close();
    ss.close();
  }
}

三、优化tcp传输的客户端和服务端

在本部分,我们对前两部分的内容进行优化,实现tcp传输模式下的客户端和服务端的交互功能。

/**
*优化tcp传输的客户端
*/
import java.io.ioexception;
import java.io.inputstream;
import java.io.outputstream;
import java.net.socket;

public class clientupdate {
  public static void main(string[] args) throws ioexception {

    socket socket = new socket("192.168.1.100", 10002);

    outputstream out = socket.getoutputstream();

    out.write("tcp!".getbytes());

    // 读取服务端返回的数据,使用socket读取流
    inputstream in = socket.getinputstream();
    byte[] buf = new byte[1024];

    int len = in.read(buf);

    string text = new string(buf, 0, len);

    system.out.println(text);

    socket.close();
  }
}

/**
*优化tcp传输的服务端
*/
import java.io.ioexception;
import java.io.inputstream;
import java.io.outputstream;
import java.net.serversocket;
import java.net.socket;

public class serverupdate {
  public static void main(string[] args) throws ioexception {

    // 1、创建服务端对象
    serversocket ss = new serversocket(10002);

    // 2、获取连接过来的客户端对象
    socket s = ss.accept(); //accept方式为阻塞式方法

    string ip = s.getinetaddress().gethostaddress();

    // 3、通过socket对象获取输入流,要读取客户端发来的数据
    inputstream in = s.getinputstream();

    byte[] buf = new byte[1024];

    int len = in.read(buf);
    string text = new string(buf, 0, len);
    system.out.println(ip + ":" + text);

    // 使用客户端的socket对象的输出流给客户端返回数据
    outputstream out = s.getoutputstream();
    out.write("收到".getbytes());

    s.close();
    ss.close();
  }
}

四、创建英文大写转换服务器

应用tcp(transmission control protocol,传输控制协议)的相关性质,创建一个基于tcp传输下的英文大写转换服务器,要求:客户端输入字母数据,发送给服务端;服务端收到数据后显示在控制台,并将该数据转成大写字母返回给客户端;直到客户端输入“over”为止,转换结束。

import java.io.bufferedreader;
import java.io.ioexception;
import java.io.inputstreamreader;
import java.io.printwriter;
import java.net.socket;

public class transclient {
  public static void main(string[] args) throws ioexception {
    /**
     * 思路:创建客户端
     * 1、创建socket客户端对象
     * 2、获取键盘录入的数据
     * 3、将录入的信息发送给socket输出流
     * 4、读取服务端的数据并返回的大写数据
     */

    // 1、创建socket客户端对象
    socket s = new socket("192.168.1.100", 10004);

    // 2、获取键盘录入
    bufferedreader bufr = new bufferedreader(new inputstreamreader(system.in));

    // 3、socket输出流
    printwriter out = new printwriter(s.getoutputstream(), true);

    // 4、socket输入流,读取服务端的数据并返回的大写数据
    bufferedreader bufin = new bufferedreader(new inputstreamreader(s.getinputstream()));

    string line = null;

    while ((line = bufr.readline()) != null) {

      if ("over".equals(line))
        break;
      out.println(line);

      // 读取服务端返回的一行大写数据
      string upperstr = bufin.readline();
      system.out.println(upperstr);
    }
    s.close();
  }
}

import java.io.bufferedreader;
import java.io.ioexception;
import java.io.inputstreamreader;
import java.io.printwriter;
import java.net.serversocket;
import java.net.socket;

public class transserver {
  public static void main(string[] args) throws ioexception {
    /**
     * 思路:创建服务端
     * 1、创建seversocket客户端对象
     * 2、获取socket流
     * 3、通过socket, 读取客户端发过来的需要转换的数据
     * 4、显示在控制台上
     * 5、将数据转换成大写返回给客户端
     */

    // 1、创建seversocket对象
    serversocket ss = new serversocket(10004);

    // 2、获取socket对象
    socket s = ss.accept();

    // 获取ip地址
    string ip = s.getinetaddress().gethostaddress();
    system.out.println(ip + "......connected");

    // 3、获取socket读取流,并装饰
    bufferedreader bufin = new bufferedreader(new inputstreamreader(s.getinputstream()));

    // 4、获取socket的输出流,并装饰
    printwriter out = new printwriter(s.getoutputstream(), true);

    string line = null;
    while ((line = bufin.readline()) != null) {
      system.out.println(line);
      out.println(line.touppercase());
    }

    s.close();
    ss.close();
  }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!