Socket编程
通信需要的是Ip和端口;
在java中,网络通讯就叫socket通讯;
1.服务端socket
a.首先要启动一个socket服务端,本质上就是向操作系统注册一个端口号,并且监听这个端口上的消息: ServerSocket ss=new ServerSocket(10000)
//端口号不能超过65535,并且tomcat一般占用8080的端口号
//以上只是在启动一个端口,现在要建立一个连接,即等待用户的连接,谁连接的,那么接收以及发送的消息就是针对谁的;
b.Socket sc = ss.accept();
//这个accept方法是个阻塞方法,没有人请求就会一直等待,直到有人请求;阻塞方法的好处是,试想下,如果这个方法不是阻塞连接,那么可能还没有接到请求就会往下运行,等于什么东西都接收不到;
c.已经收到了客户端的请求,就可以收取消息了,其实和我们平时读消息的道理是一样的,只是这次是从连接中取数据,而不是从磁盘文件上取数据;所以需要先获得一个输入流工具,用于读取数据;
InputStream in = sc.getInputStream();
d.接下来的操作与读文件是一样的:
//从输入流中拿数据;与FileInputStream是一样的;
int read = in.read()//一次只拿一个字节;如果对方发的是a,那么接收到的int就是97;
char x = (char)read;
//如果发的是英文或者数字,可以用char强转;当然,这只是一种假设,具体发什么用什么来解码与软件内部协议有关
//也可以一次读多个字节;
byte[] b = new byte[1024];
int num = in.read(b);
//int返回的是实际读了几个字节;这种方式读取会将读取到的字节都存入字节数组
然后用String的方法将这几个字节转换一下:
//注意:如果第二次还要读数据,就不用在创建一个数组和num变量了,因为read的方法会从0开始覆盖上一个byte[];
另外,read()实际上也是一种阻塞方法,如果一直没有数据读出来,也会一直停留,直到有数据拿出来;这是好处,也是问题:如果已建立连接的这个用户一直没有输出数据,那么服务端就会一直阻塞在这里,那么下一个用户就要一直等待,直到这次线程结束,进入下一次while循环才可以;如果用户接连输出了两次,而服务端只接收了一次,那么这一次会将客户端的两次一次性接收;
new String(b,0,num);意思是将b数组从下标0开始,长度num的字节转换为字符串;
注意,写完后一定要关流,关连接;
2.客户端socket
a.客户端就只需要向服务端发出建立连接的需求,写法如下:
Socket ss = new Socket(“192.168.10.159”,10000);
//括号内填申请连接的服务端ip地址和端口,地址是字符串;如果是本机,也可以填LocalHost;
b.从连接中拿到一个发数据的工具;
OutputStream so = ss.getOutputStream();
c.利用输出流发消息;基本与FileOutputStream一致;
so.write();这个里面只能写int或者字节和字节数组,可以利用String的getBytes方法;
so.write(“你好”.getBytes());
写完后要关掉连接和流;