本讲内容: socket 只会装傻的”智能“机器人

套接字(socket)是代表计算机之间网络连接的对象。要进行计算机间的网络通讯,建立TCP连接,那么就需要Socket编程,Java提供了ServerSocket类和Socket类,可以利用他们很方便的实现,计算机间的网络通讯。

因为Java把数据的传输已经抽象成InputStream和OutputStream的输入输出流,那么对网络通讯来说,其实就是利用ServerSocket类和Socket类建立起来网络连接,进行字节流或者字符流的输入输出操作。

下面我们还是通过一个例子来学习Socket编程:只会装傻的”智能“机器人

直接上代码,服务器端 TalkServer.java :

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TalkServer {

	public static void main(String[] args) throws IOException {

		// 创建一个ServerSocket
		ServerSocket server = new ServerSocket(8080);

		// 准备接受客户连接,如果有客户连接到,则创建一个socket对象,如果没有客户连接到,那么该程序会停在本行一直等待,像是在睡眠或者假死,这种行为叫做“阻塞”,阻塞是网络通信中的术语,就是你等别人响应,如果必须等到,等不到就一直等,就是阻塞,等不到也继续向前走的当然就是非阻塞。
		Socket socket = server.accept();

		// 从socket中获取一个输入对象,以便接受从网络上来的数据
		BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));

		// 从标准输入中获取一个输入对象,以便接受从键盘上传来的数据,如果想让服务器端和客户端自由对话的话可以用此对象
		//BufferedReader keyboardInput = new BufferedReader(new InputStreamReader(System.in));

		// 从socket中获取一个
		PrintWriter socketOutput = new PrintWriter(socket.getOutputStream(),true);

		//定义一些变量
		String input;		

		// 一直执行,直到客户端表示要断开
		while(true){
			//从客户端获取用户输入的字符串
			input = socketInput.readLine();
			//发送到屏幕
			System.out.print("客户:");
			System.out.println(input);			

			//准备好回复语句
			String reply= reply(input);
			//发送到客户端
			socketOutput.println(reply);
			//发送到屏幕
			System.out.print("小瑶瑶:");
			System.out.println(reply);

			//客户如果输入的是再见则退出循环
			if(input.equals("再见")){
				break;
			}
		}	

		//关闭释放资源
		socketInput.close();
		socketOutput.close();
		socket.close();

	}

	//回复方法
	private static String reply(String input) {

		String output=replys[number%7];

		if(number%7==5){
			output = output+" "+input;
		}

		number++;
		return output;
	}

	//回复方法用到的一些变量
	static int number =0;

	static String[] replys = new String[7];

	static{
		replys[0]= "你说的啥,我听不见?";
		replys[1]= "声音再大点行不?";
		replys[2]= "声音再大点一点点行不?";
		replys[3]= "还是听不清……";
		replys[4]= "看来是网络的问题,你要不说慢点?";
		replys[5]= "听到了!听到了!你说的是:";
		replys[6]= "完了,又听不清了……";
	}

}

客户端代码 TalkClient.java :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TalkClient {

	public static void main(String[] args) throws UnknownHostException, IOException {

		Socket socket = new Socket("127.0.0.1",8080);

		// 从socket中获取一个输入对象,以便接受从网络上来的数据
		BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));

		// 从标准输入中获取一个输入对象,以便接受从键盘上传来的数据
		BufferedReader keyboardInput = new BufferedReader(new InputStreamReader(System.in));

		// 从socket中获取一个
		PrintWriter socketOutput = new PrintWriter(socket.getOutputStream(),true);

		// 定义一些变量
		String input;		

		// 一直执行
		while(true){

			//从键盘获取数据,通过socket对象发送出去
			input = keyboardInput.readLine();
			socketOutput.println(input);

			//接收从socket中获取的服务器端发回的回应信息,并发送到屏幕上
			input = socketInput.readLine();
			System.out.println(input);
		}

	}

}

编译两个文件,先运行TalkServer,开始接收客户端的连接,然后运行客户端,在客户端上打字,服务器端会有回应,运行截图如下,这里上一个服务器端的截图:

image

好了,本将就到这里。

分享至上:分享源头

随机文章

ASCII码、GB2312、Big5、UTF-8、unicode编码转换知识
ASCII码、GB2312、Big5、UTF-8、unicode编码转换知识

wordpress使用多说插件后带来的问题
wordpress使用多说插件后带来的问题

Java基础第十讲:面向对象基础(四)
Java基础第十讲:面向对象基础(四)

IOS版One Today上线
IOS版One Today上线

起凡被黑?咋做任务的空间几天都打不开啊
起凡被黑?咋做任务的空间几天都打不开啊

自用Angularjs开发环境搭建(国内通用)
自用Angularjs开发环境搭建(国内通用)

相关文章

Android BlueStacksAppPlayer最新测试版发布
Android BlueStacksAppPlayer最新测试版发布

在facebook上创建页面并给予唯一url
在facebook上创建页面并给予唯一url

AngularJS的controllerAs常见用法
AngularJS的controllerAs常见用法

随机从数据库取n条记录
随机从数据库取n条记录

内容分享:道招
本文链接:第二十一讲:网络编程(一)
道招声明:除特别标注或作者不详外,本站所有文章均为原创,转载请注明。欢迎共同关注互联网!