java Socket笔记
上图:
首先,在服务端,要有一个
ServerSocket serverSocket = new ServerSocket(12345);
端口随便整,尽量大点,不要和系统用的冲突了就行。
要获取socket对象(获取之后可以加入到容器中,方便管理)
Socket acceptSocket = serverSocket.accept();
另外开一个线程,运行accepet()这个阻塞方法,等待socket的连接。
监听从socket客户端传来的消息
这些socket都是没有标识符的,所以如果要区分是谁发的,发给谁的,个人认为应该让客户端传来类似json的消息,加以标识。
因为每一个socket对象都是长时间监听,所以也都开一个线程(直观点看成一个USER),专门监听。
这时候就要把socket对象作为成员变量包装进USER。服务器端则添加一个USER的容器放置。
在USER线程的run方法中,可以这样子写,来接收消息:
public void run() {
try {
BufferedReader bufferReader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "utf-8"));
String line = null;
while ((line = bufferReader.readLine()) != null) {
//statement;
}
bufferReader.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
输出消息:
// 输出消息
public void out(String out) {
try {
writer = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream(), "UTF-8"));
writer.write(out + "\n");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
这仅仅是服务器端的写法,并且只能传文字,如果要传图片,个人认为要加上http通信,将文件传到服务器端,再在socket发送的消息中添加一个图片URL。
客户端的写法和服务端的写法是差不多的。
要注意,一个socketClient和另一个socketClient并不是直接通信,而是经过
1 我方输出
2 服务器输入
3 服务器输出
4 对方接收
这四个过程
当然也可以通过server建立连接之后,两个client直接建立socket连接。