关于socket通信的学习

1启动seversocket服务等待客户端发送请求,或者说是发起输出流outputStream,然后通过inputStream获取流中的数据,在学习socket通信的时候首先应该先掌握java中的IO这是比较重点的(不知道我这样描述对不对)。

ps:

IO流操作一般分为两类:字符流和字节流。以“Reader”结尾都是字符流,操作的都是字符型的数据;以“Stream”结尾的都是字节流,操作的都是byte数据。下面都是以字节的方式操做交互数据的。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

public class TestOtherTransitService  extends Thread{
    private static final Logger log = LoggerFactory.getLogger(TestOtherTransitService.class);
    public static ServerSocket serverSocket = null;
    public TestOtherTransitService(ServerSocket serverSocket){
        this.serverSocket=serverSocket;
    }
    @Override
    public void run() {
        while (!this.isInterrupted()) {//判断是否被断开连接
            try {
                log.info("port=6002 waiting request ...");
                byte[] b = new byte[13];
                Socket s = serverSocket.accept();//点进入看源码accept()方法是建立连接
                InputStream in = s.getInputStream();//输入流获取传输过来的二进制流
                int len = in.read(b);//把获取的二进制流放入到byte数组中,并且返回byte的长度。
                log.info("length={},transit content:{}", len,SocketUtil.byteToHex16(b));
            byte[] newRequestContent=this.getReturnContent(b);//操作回传byte数组,此方法没有给出
			OutputStream out=s.getOutputStream();
			out.write(newRequestContent);


            } catch (Exception e) {
                log.error("Socket监听进程出现异常", e);
            }
        }
    }
    public static void main(String args[]){//创建一个主函数
        try{
        serverSocket = new ServerSocket(6002);//创建一个端口为6002的serverSocket
        TestOtherTransitService testOtherTransitService= new TestOtherTransitService(serverSocket);//构造函数
        testOtherTransitService.start();//启动serverSocket
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2接下来是客户端,客户端个人理解就是根据ip和port发起通信连接到服务端。直接看代码。因为以下是以我自己本身的项目为测试参考的所以其中有些参数并不是必须的,可以忽略。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;

import java.net.Socket;
import java.net.UnknownHostException;


public class TestClient {
	private static final Logger log = LoggerFactory.getLogger(TestClient.class);

	public static void client() throws UnknownHostException, IOException, InterruptedException {
		byte[] b13={0x01, 0x00, 0x00, 0x00, (byte)0xA9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
				 0x00,};
		String host = "localhost";

		Socket s = new Socket(host, 6000);
		OutputStream out = s.getOutputStream();
		log.info("成功写入信心:"+SocketUtil.byteToHex16(b13));
		out.write(b13);
		log.info("成功写入完毕,准备开始读取回传信息");
		InputStream in=s.getInputStream();
		int len=in.read( b13);
		log.info("成功读取回传信息:"+SocketUtil.byteToHex16(b13));
	}
	
	public static void main(String[] args) {
		try {
			TestClient.client();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

以上就是一个简单的socket的通信,嗯其实还想写点子进程的东西但是今天没有时间了改日!

猜你喜欢

转载自blog.csdn.net/weixin_42173547/article/details/81902552