当前位置: 移动技术网 > IT编程>开发语言>Java > 关于Socket的解析以及双方即时通讯的java实现方法

关于Socket的解析以及双方即时通讯的java实现方法

2019年07月22日  | 移动技术网IT编程  | 我要评论

在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进行简单的通信的实现就结束了~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网