[size=large] 寒假伊始,正式学习网络通信基础,虽然以前在Java程序设计课的实验课上我已经实现了简单的局域网聊天软件,但是感觉无论是服务器端还是客户机端的程序的健壮性都欠佳,一不小心就会崩溃,至整个程序于死地。而且,用户体验也很差,基本上找同学测试该软件时,我都得坐在他的旁边,生怕出错!所以,我决定寒假期间留校一星期好好再深入研究一下网络通信。因为我感觉这学期的计算机网络,TCP/IP以及Java程序设计等几门专业课学的都还不错,考试成绩也很理想,故有信心学好网络通信知识,并完善之前所编写的程序。
长话短说,正式切入主题。我把网络通信基础比作一门武林绝学,而它的第一式便是创建一个简单的服务器,目的是能将客户机发来的字符串显示出来,并且再回送给客户机(客户机暂时使用telnet命令连接服务器)。[/size]
[size=medium] 以下是具体的代码实现:[/size]
[size=small][color=red]第一步,在指定端口上创建一个ServerSocket对象,即服务器对象:[/color][/size]
[size=small][color=red]第二步,服务器创建成功后,便进入等待状态,等待客户机的连接:[/color][/size]
[color=blue]注:调用服务器对象accept()方法时,程序就会“阻塞”在这个调用上,或者可以理解为服务器“卡”到这个函数调用上,直到有一个客户机连接上来,这个方法才会返回,返回一个Socket类对象,这个对象就代表了服务器与客户机之间的连接,以后,服务器与客户机的通信就在这个Socket类型的对象client上执行。[/color]
[size=small][color=red]第三步,从Socket连接对象上调用方法得到输入输出流:[/color][/size]
[size=small]如果对套接字的输入输出流不甚了解,请看下图:[/size]
[img]http://dl.iteye.com/upload/attachment/394907/ddacc32d-71d6-3f09-b28e-2343035f3df0.jpg[/img]
[color=blue]注:当你在指定端口创建了一个ServerSocket对象后,调用Server对象的accept()方法等待客户机连接进入;当客户机连接进入后,在服务器程序中,即得到了一个它们之间通话通道的连接对象Socket;最后,我们从这个Socket上得到输入输出流对象;当你向输出流中写数据时,数据就被发向客户机,如果你从输入流中读数据,读到的就是客户机发来的数据。[/color]
[size=small][color=red]第四步,可以实现简单通信了。从输入流中读取数据,向输出流中写入数据,读到的是客户机发来的,写入的就会发送给客户机:[/color][/size]
[size=small][color=red]第五步,整合之前的代码:[/color][/size]
[size=large] 以上便是一个简单服务器的实现过程,有过编程经验的人一定会发现这个服务器bug很多,相当脆弱,别急,这才刚开始。。。。。。[/size]
长话短说,正式切入主题。我把网络通信基础比作一门武林绝学,而它的第一式便是创建一个简单的服务器,目的是能将客户机发来的字符串显示出来,并且再回送给客户机(客户机暂时使用telnet命令连接服务器)。[/size]
[size=medium] 以下是具体的代码实现:[/size]
[size=small][color=red]第一步,在指定端口上创建一个ServerSocket对象,即服务器对象:[/color][/size]
java.net.ServerSocket server = new java.net.ServerSocket(port);
System.out.println("服务器已经创建!" + "端口号是:" + port);
[size=small][color=red]第二步,服务器创建成功后,便进入等待状态,等待客户机的连接:[/color][/size]
// 等待客户机的进入,服务器进入阻塞状态
java.net.Socket client = server.accept();
[color=blue]注:调用服务器对象accept()方法时,程序就会“阻塞”在这个调用上,或者可以理解为服务器“卡”到这个函数调用上,直到有一个客户机连接上来,这个方法才会返回,返回一个Socket类对象,这个对象就代表了服务器与客户机之间的连接,以后,服务器与客户机的通信就在这个Socket类型的对象client上执行。[/color]
[size=small][color=red]第三步,从Socket连接对象上调用方法得到输入输出流:[/color][/size]
//从连接对象上得到输入/输出流对象
InputStream ins = client.getInputStream();
OutputStream ous = client.getOutputStream();
[size=small]如果对套接字的输入输出流不甚了解,请看下图:[/size]
[img]http://dl.iteye.com/upload/attachment/394907/ddacc32d-71d6-3f09-b28e-2343035f3df0.jpg[/img]
[color=blue]注:当你在指定端口创建了一个ServerSocket对象后,调用Server对象的accept()方法等待客户机连接进入;当客户机连接进入后,在服务器程序中,即得到了一个它们之间通话通道的连接对象Socket;最后,我们从这个Socket上得到输入输出流对象;当你向输出流中写数据时,数据就被发向客户机,如果你从输入流中读数据,读到的就是客户机发来的数据。[/color]
[size=small][color=red]第四步,可以实现简单通信了。从输入流中读取数据,向输出流中写入数据,读到的是客户机发来的,写入的就会发送给客户机:[/color][/size]
String msg = "您好!我是服务器king。。。\r\n";
byte[] data = msg.getBytes();// 取得组成这个字符串的字节
ous.write(data);// 用输出对象发送数据
ous.flush();// 强制输出
client.close();// 关闭与客户机的连接
[size=small][color=red]第五步,整合之前的代码:[/color][/size]
/**
* 简单服务器的实现
* @author king
*
*/
public class ChatServer {
/**
* 在指定端口上启动一个服务器
*
* @param port
* :服务器所用的端口号
*/
public void setUpServer(int port) {
try {
// 建立绑定在指定端口上的服务器对象
ServerSocket server = new ServerSocket(port);
System.out.println("服务器已经创建!" + "端口号是:" + port);
// 让服务器进入等待状态:阻塞状态
Socket client = server.accept();
System.out.println("有一个客户机连接到服务器!");
// 从连接对象上得到输入输出流对象
InputStream ins = client.getInputStream();
java.io.OutputStream ous = client.getOutputStream();
String msg = "您好!我是服务器king。。。\r\n";
byte[] data = msg.getBytes();// 取得组成这个字符串的字节
ous.write(data);// 用输出对象发送数据
ous.flush();// 强制输出
client.close();// 关闭与客户机的连接
} catch (Exception e) {
e.printStackTrace();
}
}
//主函数
public static void main(String[] args) {
ChatServer cs = new ChatServer();
cs.setUpServer(9090);
}
}
[size=large] 以上便是一个简单服务器的实现过程,有过编程经验的人一定会发现这个服务器bug很多,相当脆弱,别急,这才刚开始。。。。。。[/size]