心情:晴朗
————————
(1)Java中的Socket
Socket是套接字,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。说的开水一点,就是应用程序就是小区用户,socket就是用户家的门牌号,网络就是小区外的世界,比如说,就是电力公司。当电力公司要像某个小区用户收电费时,电力公司就会通过门牌号找到业主收费,业主也为自己的家(id:门牌号)交电费嘛,额额额额,例子举的不好。
Socket是服务器和客户端之间通信的媒介,也就是TCP/IP建立连接的三次握手过程的实现。一个Socket通信流程:
1、服务器监听
2、客户端发出请求
3、建立链接
4、通信
在Java中,ServerSocket用于服务器端,Socket是建立网络时用的,建立成功后,应用程序两端都会产生一个Socket实例,操作这个实例,完成对话。对于一个网络链接而言,套接字是平等的,不管是Socket还是ServerSocket都是通过Socket类及其子类完成功能。
(2)板栗:一个Socket聊天服务器的建立:
具有向客户端发送数据的功能:
主程序:
package talkWithClient;
public class MainClass {
public static void main(String[] args){
new ServerListener().start();
}
}
线程1——监听线程
package talkWithClient;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class ServerListener extends Thread {
public void run(){
try {
//服务器端的请求
ServerSocket serverSocket = new ServerSocket(12345);
while(true){
//阻塞等待客户端建立连接
Socket socket = serverSocket.accept();
//客户端建立连接
JOptionPane.showMessageDialog(null, "有客户端链接到本机的12345窗口");
//响应链接,将socket链接传递给其它线程
new ChatSocket(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
线程2——响应线程
package talkWithClient;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
public class ChatSocket extends Thread {
Socket socket;
public ChatSocket(Socket s){
this.socket = s;
}
public void out(String out){
try {
socket.getOutputStream().write(out.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void run(){
int count = 0;
while(true){
count++;
out("loop"+count);
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}