Socket套接字

来源:互联网 发布:网站数据加密 编辑:程序博客网 时间:2024/06/11 02:00
应用程序中通常通过套接字向网络发送请求或者应答网络请求。
在Java中,Socket和ServerSocket类位于库java.net包中,ServerSocket用于服务器端,Socket是建立网络连接的时候使用的。在连接成功的时候,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需要的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或者客户端而产生不同级别。不管是Socket还是ServerSocket它们工作都是通过Socket类以及其子类完成的。
建立Socket的三个步骤;
1.服务器监听
2.客户端发出请求
3.建立并确认链接
4.相互通信

Socket特点:
1.Socket基于TCP链接,数据传输有可靠性保障
2.Socket使用于建立长时间链接
3.Socket编程通常应用于即时通讯。

ServerSocket的使用方法:
1.创建一个ServerSocket的实例;
ServerSocket serverSocket = new ServerSocket(12345);
//当创建这个ServerSocket的实例后,它会阻塞主线程,直到收到客户端Socket发出的通信请求
//注意:实例化ServerSocket的端口一般选择在1-65535之间,一般选择数值比较大的端口号,以免和计算上其他服务的端口冲突。
2.获得客户端的通信请求,在服务器端实例化一个socket。该socket的对象由ServerSocket的accept方法返回实例。
Socket socket = serverSocket.accept();
下面是一个简短的程序来接ServeSocket运行的机制:
public class MyServerSocket { public static void main(String[] agrs){  try{   ServerSocket serverSocket = new ServerSocket(12345);   Socket socket = serverSocket .accept();   JOptionPane.showMessageDialog(null,"已经有客户机连接到服务器");  }catch(Exception e){   e.printStackTrace();  } }}


在浏览器输入本机ip地址:12345(端口号),则可以看见应用程序中弹出"已经有客户机连接到服务器"的对话框。
3.下面介绍怎么在线程中封装ServerSocket通信
上面说到ServerSocket创建后会阻塞服务器线程,直到接受到客户端请求后才继续执行后续程序。但是往往在服务器端主线程一般是不允许阻塞的。而且不仅如此,客户端往往是有多个,当多个客户端请求服务器通信的时候,服务器就要利用多线程的方法来解决每个客户端的需求了。
一.首先创建一个ServerSocketThread类继承Thread类,实现run()方法,用来监听客户端的请求,这样服务器主线程就不会因为等待客户端请求而阻塞了,而是另外开辟一个线程来运行等待客户端请求。具体代码如下:
import java.net.ServerSocket;import java.net.Socket;import javax.swing.JOptionPane;public class ServerSocketThread extends Thread { @Override public void run() {    try{     ServerSocket serverSocket = new ServerSocket(12345);     while(true){      Socket socket = serverSocket .accept();      JOptionPane.showMessageDialog(null,"已经有客户机连接到服务器");      new SocketThread(socket).start();     }    }catch(Exception e){     e.printStackTrace();    } }}


二.新开辟一个线程来接受客户端请求后,每当客户端发送一个请求,ServerSocketThread就会产生一个Socket实例,用来与该客户端进行通信。所有也要有一个线程来处理每个客户端的通信操作。
下面创建一SocketThread类继承Thread类。并实现run方法。
具体代码如下:
package nettools;import java.io.IOException;import java.io.OutputStream;import java.net.Socket;public class SocketThread extends Thread { Socket socket = null; public SocketThread(Socket socket){  this.socket = socket; } @Override public void run() {  try {   OutputStream out = socket.getOutputStream();   int count = 0;   String message ="Welcom you...";   while(true){    message = message+count++;    out.write(message.getBytes("UTF-8"));    out.flush();    sleep(1000);   }  } catch (IOException e) {   e.printStackTrace();  } catch (InterruptedException e) {   e.printStackTrace();  }  }}


三.可以打开多个cmd模拟多个客户端向服务器发送通信请求,具体结果如下图所示。
在cmd中输入telnet localhost 12345 回车后便可以接受到服务器发送过来的消息。
如果你的电脑没有telnet服务,请在控制面板中启动和关闭服务中添加安装。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果官网上买的耳机坏了怎么办 led灯开关关掉了闪烁是怎么办 我朋友借的网贷光给我打电话怎么办 电脑上的文件变成了图片查看怎么办 外卖店打印机纸卡住打不开了怎么办 微信撤回图片留下一堆代码怎么办 拼多多砍价免费拿砍不到0元怎么办 一岁三个月宝宝老足拉肚子怎么办丶 想打好关系送礼发红包不敢收怎么办 我在相亲市场太受欢迎了怎么办小说 有人报警说我诈骗警察说立案怎么办 微信账号长时间未登录不想要怎么办 手机号注销了百度云登录不了怎么办 申请百度云账号的手机不用了怎么办 新注册的微信号显示账号异常怎么办 注册公众号说邮箱被占用了怎么办 向钱贷登录手机号换了怎么办 qq号绑定的手机号码换了怎么办 用手机号注册的支付宝换号了怎么办 支付宝转的账户手机号消号了怎么办 激活微信账号手机号写错了怎么办 大学试卷没有写名字和考号怎么办 公司被注销了公众号还想要怎么办 公司认证的公众号公司注销了怎么办 信而富注册手机号码不用了怎么办 信而富本时段额度已放完怎么办 知道qq号密码账号忘了怎么办 扣扣绑定的手机号被别人用了怎么办 我的手机号被别人绑定了快手怎么办 微信密码忘记了没绑定手机号怎么办 扣扣绑定银行卡忘记密码了怎么办 扣扣忘记密码了又换手机号了怎么办 微信订阅号里有删除后的信息怎么办 申请微信公众号邮箱已被占用怎么办 公众号验证没有对公账户怎么办 qq密码忘记了怎么办手机绑定没有 我的扣扣怎么申诉都找不回来怎么办 装修装的不好又没有签合同怎么办 日本免税的零食不小心拆了怎么办 闲鱼同意买家退货了买家不退怎么办 手机里淘宝钱付了不发货怎么办