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

一.网络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;
	@Override
	public 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 block
						e.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;
	@Override
	public 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文件,控制台截图:


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


可以继续输入


接着客户端会出现:



欢迎各位点评指导!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值