关于Java的网络通信简要介绍

来源:互联网 发布:arduino图形化编程 编辑:程序博客网 时间:2024/05/16 16:10

一.网络Socket通信可以分为两种:

1.TCP/IP通信

2.UDP/IP通信

二.TCP协议是一种以固连线为基础的协议,它提供两台计算机之间可靠的数据传送。可以保证从一端数据传至连接的另一端时,数据能够确实送达。

三.UDP协议无连接通信协议,不保证可靠数据的传输,但能够同时向若干目标发送数据。UDP协议适合于一些对数据准确性要求不高的场合。

四.针对Socket通信简要介绍一个例子:(PS:只是对Socket通信的一个简单应用,不喜勿喷微笑,欢迎提出意见!吐舌头)

这个例子我采用到了线程,线程同步来编写;

首先,先创建一个服务器端:先创建ServerSocket对象来存储通信时的端口号;

接着创建Socket来监听服务器的端口,并且通过InputStream来得到传送过来的数据;

由于我采用的是线程来运行通信,所以如果传递过来的数据为空的时候,说明客户端没有发送数据,所以将客户端启动,并且将服务器端挂起。(要注意必须先激活客户端,才挂起服务器,否则当你挂起服务器之后,然后启动线程,系统会自动把服务器线程给开启。);如果数据不为空,那么将数据输出,然后创建一个输出流对象,方便我们可以从控制台输入数据。接着我用了一个判断,判断输入的数据是不是字符0,如果是就结束该线程。接着将数据写入,发送,关闭以上的所有操作对象。

public class Server implements Runnable{private static Integer o = 1;@Overridepublic void run() {synchronized (o) {while(true){try {ServerSocket ss = new ServerSocket(8888);Socket s = ss.accept();InputStream in = s.getInputStream();byte [] data = new byte[1024];in.read(data);if(data.equals("")){o.notify();try {o.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else{String str = new String(data);System.out.println("服务器收到的信息是: " + str);OutputStream out = s.getOutputStream();Scanner sin = new Scanner(System.in);String si = sin.nextLine();while(si.equals("0")){Thread.currentThread().stop();}out.write(si.getBytes());out.flush();out.close();in.close();s.close();ss.close();}} catch (IOException e) {e.printStackTrace();}}}}}
接着是客户端的介绍:

第一步,创建一个Socket对象来存储需要进行交流的IP地址和通信的端口号;

接着创建一个输出流对象用来写入数据;

后面的代码和服务器端的代码同理。

public class Client implements Runnable{private static Integer o = 1;@Overridepublic void run() {while(true){synchronized (o) {try {Socket socket = new Socket("192.168.2.101", 8888);OutputStream out = socket.getOutputStream();Scanner sin = new Scanner(System.in);String string = sin.nextLine();out.write(string.getBytes());out.flush();InputStream in = socket.getInputStream();byte [] data = new byte[1024];in.read(data);if(data.equals("")){o.notify();o.wait();}else{String string2 = new String(data);System.out.println("客户端接收到的信息是: " + string2);in.close();out.close();socket.close();}} catch (Exception e) {}}}}}
然后是主函数的调用了:

在这里调用的时候需要特别注意:需要先启动服务器线程(所以我先把客户端线程给屏蔽了)

public class Test {public static void main(String[] args) {Server server = new Server();Client client = new Client();Thread thread = new Thread(server);Thread thread2 = new Thread(client);thread.start();//thread2.start();}}
然后启动客户端线程:

public class Test {public static void main(String[] args) {Server server = new Server();Client client = new Client();Thread thread = new Thread(server);Thread thread2 = new Thread(client);//thread.start();thread2.start();}}
    由以上可知我们开启了两个线程,此时系统运行了两个java文件,控制台截图:


按下回车键之后会自动跳转到以下截图:


可以继续输入


接着客户端会出现:



欢迎各位点评指导!!!