TCP网络编程

TCP网络编程

TCP需要服务端与客户端建立连接,建立连接后才能发送数据。

服务端需要提供本机ip和指定端口号。

客户端连接服务端需要指定服务端的IP和端口号。

1、对于服务器,要创建服务器的套接字,服务器的IP为本机ip,不用指定,但要指定端口号,接着开始侦听客户端连接。

//1.创建
int port = 16666;
ServerSocket listener = new ServerSocket(port);
//2.侦听
Socket socket = listener.accept();

2、对于客户端,要创建连接套接字,指定连接的主机ip和端口号。

//1.创建连接服务器的套接字
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 16666;
Socket socket = new Socket(serverIP,port);

接着从套接字中获取输入输出流,
输入流 用于 从套接字中取东西,输出流 用于 往套接字里放东西。

另外,往socket里传大量数据(如文件)时,传输完毕后需要通知socket,“我传完了。”
socket.shutdownOutput(); 否则另一端不能开始从socket中读取字节。

客户端-服务器 聊天系统

client
package com.net.transstring;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class Client {
  public static void main(String[] args) throws Exception {
    //1.创建连接服务器的套接字
    InetAddress serverIP = InetAddress.getByName("127.0.0.1");
    int port = 16666;
    Socket socket = new Socket(serverIP,port);
    //2.获取输入流输出流
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
    Scanner scanner = new Scanner(System.in);
    boolean flag = true;
    System.out.println("欢迎跟小育聊天!输入-1退出聊天!");
    while(flag == true) {
      String msg = scanner.nextLine();
      if(msg.equals("-1")){
        flag = false;
      }
      //3.1处理数据(发送)
      bw.write(msg);
      bw.newLine(); //换行
      bw.flush(); //刷新缓存
      //3.2处理数据(接收)
      String str = br.readLine();
      System.out.println("小育回复:"+str);
    }

    //4.关闭资源
    scanner.close();
    bw.close();
    socket.close();

  }
}

server
package com.net.transstring;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
  public static void main(String[] args) throws Exception {
    //1.创建
    int port = 16666;
    ServerSocket listener = new ServerSocket(port);
    System.out.println("小育上线啦!");
    //2.侦听
    Socket socket = listener.accept();
    //3.获取输入输出流
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));
    String[] responses ={"小育什么也不知道哦","真的吗!","太好啦!",
    "那你可以带小育一起去玩嘛?","谢谢你!","好耶!"};
    boolean flag  = true;
    while(flag == true){
     //4.1处理数据(接收)
      String data = br.readLine();
      String response;
      if(data.equals("-1")){
        response = "那再见咯!";
        flag = false;
      } else {
        response = responses[data.hashCode()%6];
      }
      System.out.println("客户端说:"+data);
      //4.2处理数据(发送)
      bw.write(response);
      bw.newLine();
      bw.flush();
    }
    //5.关闭资源
    bw.close();
    br.close();
    socket.close();
    listener.close();

  }
}

客户端-服务端 文件传输系统

client
package com.net.transfile;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class Client {

  public static void main(String[] args) throws Exception {
    //1.创建连接服务器的套接字
    InetAddress serverIP = InetAddress.getByName("127.0.0.1");
    int port = 16666;
    Socket socket = new Socket(serverIP, port);

    //2.获取输入流输出流
    OutputStream os = socket.getOutputStream();
//    Scanner scanner = new Scanner(System.in);
//    String msg = scanner.nextLine();
    String msg = "C:\\Users\\86186\\Desktop\\飞机.png";
    System.out.println("欢迎使用文件传输!");
    //3、读取文件
    FileInputStream fis = new FileInputStream(new File(msg));
    //4、写入文件
    byte[] buffer = new byte[1024];
    //注意读和写之间要有缓存。不能把输入流直接对接输出流
    int len;
    while ((len = fis.read(buffer)) != -1) {  //输入流存到缓存
      os.write(buffer, 0, len);  // 缓存放到输出流
    }
    //5.通知服务器我传完了(必要!!!!!)
    //因为这是那个在传的管道,对面不能用。所以有必要通知停止传了再使用
    //仅对于这种将文件数据传入socket管道的情况
    socket.shutdownOutput();

    //6、接收客户端响应,转换成字符串,用字节数组流
    InputStream is = socket.getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buffer2 = new byte[1024];
    int len2;
    while ((len2 = is.read(buffer2)) != -1) {
      baos.write(buffer2, 0, len2);
    }
    System.out.println("得到输入");
    //字节数组流可以把字节直接转换成字符串而不乱码
    System.out.println("服务端回复:" + baos.toString());

    //6.关闭资源
//    scanner.close();
    is.close();
    os.close();
    socket.close();

  }

}


server
package com.net.transfile;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {

  public static void main(String[] args) throws Exception {
    //1.创建欢迎连接套接字
    int port = 16666;
    ServerSocket listener = new ServerSocket(port);
    System.out.println("欢迎使用文件传输系统!");
    //2、监听
    Socket socket = listener.accept();

    //1、获取输入流
    InputStream is = socket.getInputStream();
    int len;
    byte[] buffer = new byte[1024]; //因为不能输入流直接对接输出流,所以中间有缓存
    String fileName = "receive.jpg";
    //2、把字节流写入文件
    FileOutputStream fos = new FileOutputStream(new File(fileName));
    while ((len = is.read(buffer)) != -1) {
      fos.write(buffer, 0, len);
    }

    //3、通知客户端接收到了
    OutputStream os = socket.getOutputStream();
    os.write("已收到".getBytes());

    is.close();
    os.close();
    socket.close();
    listener.close();

  }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值