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通訊教程就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。