1. 程式人生 > >關於socket通訊的學習

關於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的通訊,嗯其實還想寫點子程序的東西但是今天沒有時間了改日!