1. 程式人生 > 程式設計 >Java實現簡單的socket通訊教程

Java實現簡單的socket通訊教程

今天學習了一下java如何實現socket通訊,感覺難點反而是在io上,因為java對socket封裝已經很完善了。

今天程式碼花了整個晚上除錯,主要原因是io的flush問題和命令列下如何執行具有package的類,不過最後問題基本都解決了,把程式碼貼出來供大家參考

server

public class TcpServer {
  public static void main(String[] args) throws Exception {
    ServerSocket server = new ServerSocket(9091);
    try {
      Socket client = server.accept();
      try {
        BufferedReader input =
            new BufferedReader(new InputStreamReader(client.getInputStream()));
        boolean flag = true;
        int count = 1;
 
        while (flag) {
          System.out.println(客戶端要開始發騷了,這是第 + count + 次!);
          count++;
           
          String line = input.readLine();
          System.out.println(客戶端說: + line);
           
          if (line.equals(exit)) {
            flag = false;
            System.out.println(客戶端不想玩了!);
          } else {
            System.out.println(客戶端說: + line);
          }
 
        }
      } finally {
        client.close();
      }
       
    } finally {
      server.close();
    }
  }
}

client

public class TcpClient {
  public static void main(String[] args) throws Exception {
    Socket client = new Socket(127.0.0.1,9091);
    try {
      PrintWriter output =
          new PrintWriter(client.getOutputStream(),true);
      Scanner cin = new Scanner(System.in);
      String words;
 
      while (cin.hasNext()) {
        words = cin.nextLine();
 
        output.println(words);
 
        System.out.println(寫出了資料: + words);
      }
 
      cin.close();
    } finally {
      client.close();
    }
  }
}

補充知識:Collections.sort 排序出現的java.lang.IllegalArgumentException的異常

1.問題分析(Java 7)

在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java 7中,內部實現換成了TimSort(做了大量優化的歸併排序),其對物件間比較的實現要求更加嚴格:

Comparator的實現必須保證以下幾點:

原則1. sgn(compare(x,y)) == -sgn(compare(y,x))

原則2. (compare(x,y) > 0) && (compare(y,z) > 0) 意味著 compare(x,z) > 0

原則3. compare(x,y) == 0 意味著對於任意的z:sgn(compare(x,z)) == sgn(compare(y,z)) 均成立

而我們的比較器程式碼是:

 public int compare(Integer a,Integer b) {
  return a > b ? 1 : -1;
   }

違背了原則1:假設x的value為1,x的value也為1;那麼compare(X,Y) ≠ –compare(Y,X),故會丟擲java.lang.IllegalArgumentException的異常

2.異常重現

程式碼:

List<Integer> ases = new ArrayList<>(Arrays.asList( -1,-1,1,1));
        Collections.sort(ases,new Comparator<Integer>() {
          @Override
          public int compare(Integer a,Integer b) {
            return a > b ? 1 : -1;
          }
        });

PS:

陣列的大小必須大於等於32.小於32時不會出現java.lang.IllegalArgumentException異常.原因是:java中預設的MIN_MERGE為32.若待排序的陣列小於MIN_MERGE時,會使用Binary Sort,而不會使用TimSort.

3.解決方法

將我們的比較器的compare修改成:

public int compare(Integer a,Integer b) {
      return a == b ? 0 : (a > b ? 1 : -1);
    }

即可.

以上這篇Java實現簡單的socket通訊教程就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。