关于Socket的解析以及双方即时通讯的java实现方法
在java编程之中,我们通常都会接触到网络编程,那么不可避免地就会接触到socket通信,下面我将对socket进行简单的解析,并给出双方通讯的代码实现方案
首先我们来介绍一下整个socket的通信过程
首先服务端先创建一个socketserver,那么创建一个socketserver需要我们指定端口号,如下
serversocket serversocket=new serversocket(8888);
像上面这样我们就简单的开了一个端口号为8888的serversocket了
接下来我们需要去接收来自客户端的连接请求,也就是图中的other socket,我们可以利用sockerserver的accept方法来建立连接,并且这个方法会返回一个socket,用于和other socker进行通信,简单来说,我们就是利用sockerserver来获取socket,然后利用这个socket和别人通信
接下来我们获取socket的输入输出流,实现发送和接收信息,到此,我们已经知道两方进行socket通信的基本思路了
接下来我们来看看关于serversocket以及socket的一些关键方法
serversocket
首先我们看一下serversocket的构造方法,一共有4种:
1、无参的构造方法 :
serversocket(), 返回没有绑定端口号的serversocket实例
2、含一个参数的构造方法 :
serversocket(int port),返回绑定给定端口号的serversocket实例
3、含两个参数的构造方法 :
serversocket(int port, int backlog),返回绑定给定端口号的serversocket实例,并且设定同步队列(syns queue)的大小
4、含三个参数的构造方法:
serversocket(int port, int backlog, inetaddress bindaddr),返回绑定给定端口号的serversocket实例,并且设定同步队列(syns queue)的大小以及绑定给定的ip地址
主要看它的一些方法:
accept()
这个方法监听连接,一旦连接就返回一个socket用于通信,需要注意的是,该方法为阻塞方法,如果没有连接程序并不会继续执行下去
close()
关闭socket,如果accept还在阻塞的话,就会抛出一个socketexception的异常
关于serversocket就不多加赘述了,我们来看一看socket
socket
构造方法依然存在多种,这里只给出一个较为典型的
socket(string host, int port),第一个参数是主机的ip地址作为字符串传入,第二个参数为端口号
getinputstream(), getoutputstream()
获得socket的输入输出流,我们可以利用bufferreader以及printwriter来对这两个流进行操作,如下:
bufferreader reader = new bufferedreader( new inputstreamreader(socket.getinputstream())); printwriter writer = new printwriter( new outputstreamwriter(socket.getoutputstream()));
下面简单编写一个双方互相通信的java实现
首先是服务端
import java.io.*; import java.net.serversocket; import java.net.socket; import java.util.scanner; /** * created by mezereon on 2017/3/1. */ public class tcpserver { private socket socket; private serversocket serversocket; private bufferedreader reader; private printwriter writer; private scanner scanner = new scanner(system.in); //开启服务 public void run() throws ioexception { startthesocket(); } public void startthesocket() throws ioexception { serversocket=new serversocket(18080); //打开18080端口等待连接 acceptthesocket();//接受连接并且初始化socket,reader,writer openthenewthreadtogetmessagefromclient(); while(true) { getyourmessage();//获取键盘数据并作为输入 } } //接受连接并且初始化socket,reader,writer private void acceptthesocket() throws ioexception { socket=serversocket.accept();//阻塞方法,用于接受socket连接 system.out.println("some one connect me ,it is "+socket.getlocalsocketaddress());//打印地址 system.out.println("it's port is "+socket.getport());//打印端口号 reader = new bufferedreader(new inputstreamreader(socket.getinputstream()));//获得输入流 writer = new printwriter(new outputstreamwriter(socket.getoutputstream()));//获得输出流 } //扫描键盘并输入数据 private void getyourmessage() throws ioexception { string yourmessage = scanner.nextline(); checkyourmessage(yourmessage);//检查发送给客户端的信息 writer.println(yourmessage);//发送信息 writer.flush();//flush方法用于清空缓冲区,注意的是如果不flush你的信息可能发不出去一直存留在缓冲区 } //用于检查是否退出 private void checkyourmessage(string yourmessage) throws ioexception { //关闭各种 if (yourmessage.equals("exit")) { socket.close(); writer.close(); reader.close(); system.exit(0); } } //开启一个新的线程来监听客户端发来的信息 private void openthenewthreadtogetmessagefromclient() throws ioexception { //开启一个新的线程 new thread(new runnable() { @override public void run() { getthemessagefromclient(); } }).start(); } //不断循环来获取客户端发来的信息 private void getthemessagefromclient() { while(true) { string messagefromclient = null; try { messagefromclient = reader.readline(); } catch (ioexception e) { e.printstacktrace(); } printthemessage(messagefromclient);//打印客户端发来的信息 } } //打印客户端发来的信息 private void printthemessage(string messagefromclient) { if(messagefromclient!=null) system.out.println("he say:"+messagefromclient); } }
然后开始编写客户端:
import java.io.*; import java.net.socket; import java.util.scanner; /** * created by mezereon on 2017/2/27. */ public class tcpclient { private socket socket; private bufferedreader reader ; private printwriter writer; private scanner scanner = new scanner(system.in); //开启socket来连接 public void run() throws ioexception{ startthesocket(); } //开始连接服务端 private void startthesocket() throws ioexception{ toconnecttheserver();//创建socket并初始化 openthethreadtoreceiveinfofromserver();//开启一个新的线程来接受服务端发来的信息 //一个循环,用于读取键盘的输入 while(true) { string yourmessage = scanner.nextline(); //不为空则发送信息 if(yourmessage!=null) { writer.println(yourmessage); writer.flush();//记得flush清空缓冲区 } //判断是否退出 if (yourmessage.equals("exit")) { disconnect(); system.exit(0); } } } //创建一个socket来连接本机的18080端口的服务端并初始化reader和writer private void toconnecttheserver() throws ioexception { socket=new socket("127.0.0.1",18080); reader = new bufferedreader(new inputstreamreader(socket.getinputstream())); writer = new printwriter(new outputstreamwriter(socket.getoutputstream()),true); } private void openthethreadtoreceiveinfofromserver() throws ioexception { new thread(new runnable() { @override public void run() { try { printmessage();//打印从服务端收到的信息 } catch (ioexception e) { e.printstacktrace(); } } }).start(); } //循环不断读取服务端的信息 private void printmessage() throws ioexception { while (true) { string messagefromserver = null; try { messagefromserver = reader.readline();//读取信息 system.out.println("he say:" + messagefromserver);//打印信息 } catch (ioexception e) { e.printstacktrace(); } catch (nullpointerexception e) { } if(messagefromserver.equals("exit")){ disconnect();//关闭连接 system.exit(0); } } } //关闭各种 private void disconnect() throws ioexception { socket.close(); reader.close(); writer.close(); } }
至此,关于socket通信简单的介绍以及利用java进行简单的通信的实现就结束了~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
关于Socket的解析以及双方即时通讯的java实现方法
-
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
-
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
-
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总_PHP教程
-
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总_php技巧
-
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总_php技巧
-
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
-
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总_PHP教程