本讲内容: 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

好了,本将就到这里。

分享至上:分享源头

随机文章

sae-eclipse插件加新浪sae进行java项目开发
sae-eclipse插件加新浪sae进行java项目开发

迅雷下载广告无孔不入
迅雷下载广告无孔不入

QQ电脑管家的Q盘登陆超时
QQ电脑管家的Q盘登陆超时

“太阳能墨水”印在纸上就可以发电哦
“太阳能墨水”印在纸上就可以发电哦

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

将excel里面的数据导入mysql
将excel里面的数据导入mysql

相关文章

苹果的chromebook
苹果的chromebook

添加wordpress幻灯片插件FlippingBook WordPress Gallery Plugin实现相册
添加wordpress幻灯片插件FlippingBook WordPress Gallery Plugin实现相册

oppo(欧珀)手机刷机图文教程
oppo(欧珀)手机刷机图文教程

windows下xampp的mysql中文乱码
windows下xampp的mysql中文乱码

在电脑上安装Android模拟器Emulator
在电脑上安装Android模拟器Emulator

java 用math类的方法划近似圆
java 用math类的方法划近似圆

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