Java Web 编程001

Tcp Socket

实现功能:服务器和客户端间传递消息

服务器端:


//创建ServerSocket(9999)   (假设端口号为9999)

//ServerSocket对象通过方法accept()返回一个socket对象

//通过输入流接收消息(设置消息缓冲)

//打印接收到的消息

//关闭输入流

//关闭socket

//关闭serverSocket

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

/**
 * Service
 */
public class SocketTCP01Server {
    public static void main(String[] args) throws IOException {
        //本机9999端口监听,等待连接
        //要求本机没有其他服务占用,否则会阻塞
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("server monitoring in 9999 and waiting for connected...");
        //这个ServerSocket 可以通过accept() 返回多个Socket[多个客户端连接服务器的并发]
        Socket socket = serverSocket.accept();
        System.out.println("socket =" + socket.getClass());
        //通过socket.getInputStream() 读取客户端写入数据通道的数据
        InputStream inputStream = socket.getInputStream();
        //buffer
        byte[] buf = new byte[1024];
        int readLen = 0;
        //所读数据的实际长度
        //inputStream.read(buf) 返回一个整形表示字节数
        while ((readLen = inputStream.read(buf)) != -1) {
            System.out.println(new String(buf, 0 , readLen));
            //根据实际读取到的实际长度,显示内容
        }
        inputStream.close();
        socket.close();
        serverSocket.close();
        //
    }
}

客户端:

//创建客户端Socket,并用所要连接的端口号初始化

//创建输出流对象,将要发送至服务器的消息写入输出流

//关闭输出流

//关闭socket

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * Client
 * sent "hello" to Client
 */
public class SockrtTCP01Client {
    public static void main(String[] args) throws IOException {
        //connect server
        //connect the port 9999 of the computer and if connecting successful return socket
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("Client socket return =" + socket.getClass());
        //连接后生成socket,通过socket。个体Output Stream()
        //得到和socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();
        //3.通过输出流写入数据到数据通道
        outputStream.write("hello,server".getBytes());
        //关闭流对象和socket
        outputStream.close();
        socket.close();
        System.out.println("Client quit...");



    }
}

Tips:

1.一定是server端先运行,进行端口监视

2.客户端与服务端进行通信时,每个消息后最好设置一个结束标记,

写入标记结束标记   socket.shutdownOutput()  或者 writer.newLine(),后者需要使用readLine()读取字符

使用字符流

1.

socket.getOutputStream()

 OutputStream -> Writer

 使用转换流,OutputStreamWriter

2.

socket.getinputStream()

将InputStream -> Reader

使用转换流InputStreamReader()

客户端

public class SockrtTCP01Client {
    public static void main(String[] args) throws IOException {
        //connect server
        //connect the port 9999 of the computer and if connecting successful return socket
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("Client socket return =" + socket.getClass());
        //连接后生成socket,通过socket。个体Output Stream()
        //得到和socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();
        //3.通过输出流写入数据到数据通道

        //使用字符流
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,server String ");
        bufferedWriter.newLine(); //插入一个换行符表示写入的内容结束,注意,要求对方使用readLine()
        bufferedWriter.flush();//使用字符流需要手动刷新,否则数据不会写入数据通道

        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);



        //关闭流对象和socket
        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
        System.out.println("Client quit...");
    }
}

服务器端

public class SocketTCP01Server {
    public static void main(String[] args) throws IOException {
        //本机9999端口监听,等待连接
        //要求本机没有其他服务占用,否则会阻塞
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("server monitoring in 9999 and waiting for connected...");
        //这个ServerSocket 可以通过accept() 返回多个Socket[多个客户端连接服务器的并发]
        Socket socket = serverSocket.accept();
        System.out.println("socket =" + socket.getClass());
        //通过socket.getInputStream() 读取客户端写入数据通道的数据
        InputStream inputStream = socket.getInputStream();
        //buffer
        OutputStream outputStream = socket.getOutputStream();

        //使用字符流读取
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);//output

        //使用字符输出流的方式回复信息

        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello client String");
        bufferedWriter.newLine();//结束写入
        bufferedWriter.flush();//刷新

        bufferedWriter.close();//从后往前关
        bufferedReader.close();
        socket.close();
        serverSocket.close();
        //
    }
}

Tips:关闭流顺序一般为后打开的先关闭

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值