聊天,QQ,微信,陌陌很多的即时通讯的软件,不管是桌面端还是移动端,在当今社交的时代都是不可或缺的一部分。这时候说Socket和ServerSocket感觉有点老调重弹感觉,相信很多人早就知道如何使用了,而且利用这个通信原理可能已经开发出很多优秀的通信软件吧,但是我感觉这个对于刚接触java网络编程的人来说,学会Socket通信实现聊天软件,是必须的一步,了解其中的原理更是非常重要的一步,对,很多人可能觉得对着视频敲出一个软件很容易,但是你能学到什么???盲目地崇拜大神吗??,我认为需要花更多的时间去弄懂其实现的原理,然后总结一些属于自己的东西出来。本人菜鸟,但是喜欢分享一些自己的东西,希望能帮助需要帮助的人,不说废话,直接上...
为了照顾一下初学者下面就大概说下Socket的介绍:
1、Scoket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求
在 java中Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端
Socket是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个Socket实例
操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别
不因为在服务器端或在客户端而产生不同的级别,不管是Socket还是ServerSocket他们的
工作都是通过Socket类和其子类来完成的
2、建立Socket链接可分三个步骤:
1.服务器监听
2.客户端发出请求
3.建立链接
4.通信
3、Socket特点:
1.基于TCP链接,数据传输有保障
2.适用于建立长时间的链接,不像HTTP那样会随机关闭
3.Socket编程应用于即时通讯
4、ServerSocket的建立和使用:
public class ServerSocket_Test {
public static void main(String[] args) {
//port参数表示服务器监听的端口号,从1-65535
try {
ServerSocket serverSocket =new ServerSocket(12345);
//block,当没有客户端连接时,改主线程会一直阻塞等待连接,一直监听,直到有客户端连接才会执行
Socket socket= serverSocket.accept();//侦听事务的连接,accept是一个阻塞的方法,会阻塞当前的main线程,并且返回的是一个Socket类型
//建立连接,表示serverSocket在监听,如果监听到有客户端连接则会调用accept方法,然后返回一个Socket,最后建立连接
JOptionPane.showMessageDialog(null, "有客户端连接到了本机的12345端口");
//然后测试在浏览器中输入http://127.0.0.1:12345则会弹出相应有客户端连接的提示框,然后原来阻塞在accept方法那里就会往下执行
} catch (IOException e) {
e.printStackTrace();
}
}
注意:但是以上的这种方法不推荐,因为这个里面有线程阻塞,会阻塞主线程,所以推荐一种更好的方法是就是单独开启一个线程去实现服务器监听客户端的连接
5、ServerSocketListener(单独的线程实现服务器的监听)
public class ServerListener extends Thread {
@Override
public void run() {
//port参数表示服务器监听的端口号,从1-65535
try {
ServerSocket serverSocket =new ServerSocket(12345);
while (true) { //由于可能当有多个客户端连接时,accept方法就会产生多个Socket对象,需加一个while循环监听来自客户端的连接
//block,当没有客户端连接时,改主线程会一直阻塞等待连接,一直监听,直到有客户端连接才会执行
Socket socket= serverSocket.accept();//侦听事务的连接,accept是一个阻塞的方法,会阻塞当前的main线程,并且返回的是一个Socket类型
//建立连接,表示serverSocket在监听,如果监听到有客户端连接则会调用accept方法,然后返回一个Socket,最后建立连接
JOptionPane.showMessageDialog(null, "有客户端连接到了本机的12345端口");
//然后测试在浏览器中输入http://127.0.0.1:12345则会弹出相应有客户端连接的提示框,然后原来阻塞在accept方法那里就会往下执行
//将socket传递给另起的一个新的线程,即是socket通信的线程
new ChatSocket(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
然后在主方法去开启这个线程即可:
public class ServerSocket_Test {