開篇感言
之前我已經(jīng)總結(jié)了關(guān)于定時任務(wù)相關(guān)的Quartz和數(shù)據(jù)庫結(jié)果封裝相關(guān)的MyBatis源碼宰译,從兩個領(lǐng)域去了解知識碎片彬犯。接下來泡一,我將從Netty走進(jìn)另一個領(lǐng)域——網(wǎng)絡(luò)。另外跟網(wǎng)絡(luò)息息相關(guān)的流處理也可以接觸一下杭跪。
前戲例子
既然要走進(jìn)網(wǎng)絡(luò),總不能兩眼一抹黑驰吓,最基礎(chǔ)的socket編程還是需要了解的涧尿,關(guān)于BIO、NIO等理論相關(guān)知識我這里不做重復(fù)造輪檬贰,我們擼起袖子直接從實踐中來進(jìn)行探索姑廉。
接下來我會根據(jù)自己印象列出我一個手寫的例子(先說好,這個例子是錯誤的)翁涤,我們來看下:
首先我們肯定是先編寫服務(wù)端例子:
public class SocketServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("127.0.0.1",9000));
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
String info = null;
while ( (info = bufferedReader.readLine())!=null){
System.out.println(info);
}
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.write("收到回復(fù)你");
printWriter.flush();
} catch (IOException e) {
}finally {
}
}
}
接下來我們先把剩下的client端例子也發(fā)出來:
public class SocketCient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",9000);
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(outputStream,"UTF-8"));
printWriter.write("你好");
printWriter.flush();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String info = null;
while ((info = bufferedReader.readLine())!=null){
System.out.println(info);
}
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
OK,所有的實例都在這了桥言,大家可以自己先看下,感覺會不會有問題~~~~
錯誤實例解析
好了葵礼,這里開始答案揭曉号阿。先明確一點,這兩個實例跑起來鸳粉,在控制臺是看不到輸出的扔涧。剛開始的時候很郁悶,明明記得記憶中就是這么簡單呀赁严,為什么就不行呢~~ 但是我發(fā)現(xiàn)他們連接上之后扰柠,關(guān)閉掉任意一端粉铐,兩端都會停止運行,這說明我們的連接是沒有問題的卤档,問題出在讀取或者發(fā)送流數(shù)據(jù)上蝙泼。
之后各種試, 效果甚微劝枣。查資料得到汤踏,原來是出在了細(xì)節(jié)上面√蛱冢可以看到在上述中溪胶,我們用的是BufferedReader的readLine方法來讀取流數(shù)據(jù)的,這里有個細(xì)節(jié)是這是讀取行數(shù)據(jù)的稳诚,必須要有行結(jié)束標(biāo)志\n哗脖,哎,只怪自己對流這塊還是不太敏感熟悉扳还。
加上\n之后才避,我們可以再服務(wù)端中收到數(shù)據(jù),但是客戶端還是沒有返回數(shù)據(jù)氨距。但這時就難不到我了桑逝,通過自己分析,感覺是出在讀取數(shù)據(jù)的while上俏让,在這卡主楞遏,導(dǎo)致服務(wù)端發(fā)送不了數(shù)據(jù),這時我把while循環(huán)一刪首昔,果然就OK了寡喝,兩端都收到了數(shù)據(jù)。
修改完后的實例
服務(wù)端:
public class SocketServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("127.0.0.1",9000));
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
String info = bufferedReader.readLine();
System.out.println(info);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.write("收到回復(fù)你\n");
printWriter.flush();
printWriter.close();
bufferedReader.close();
} catch (IOException e) {
}finally {
}
}
}
客戶端實例:
public class SocketCient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",9000);
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(outputStream,"UTF-8"));
printWriter.write("你好\n");
printWriter.flush();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String info = bufferedReader.readLine();
System.out.println(info);
bufferedReader.close();
printWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
今日總結(jié)
今天完成了一個簡單的Socket實例沙廉,之前有點眼高手低拘荡,感覺這么簡單的代碼,自己腦中過下就行撬陵,果然自己一出手還遇到了這么多坑珊皿。以后還是得多親身嘗試,感受才會更多~~~