第一步:创建一个简单的服务器,能将客户机发来的字符串显示出来,并且再回送给客户机
Java中编写网络通信程序,就必须用到java.net包下面的API;创建一个服务器,那是相当的 简单。 第一步:在指定端口上创建一个java.net.ServerSocket对象
ServerSocket server=new ServerSocket(9090);
System.out.println("服务器创建成功!"+port);
第二步:当服务器创建成功后,就像的的手机开机后,进入待机状态一样,你也要让服务器进入 等待状态,当然是等待其它的客户机来连结它:
Socket client = server.accept();
第三步:通过client对象得到输入/输出流
OutputStream out=client.getOutputStream();//得到一个输出/输入流对象
InputStream ins =client.getInputStream();
第四步:根据输入流对象读取数据,向输出流对象写入数据,读到的,即是客户机发来的,写出的即是发给客户机的。
如何使用命令提示符连结创建的服务器:
物理上,一台计算机,可以逻辑中的分成客户机和服务器两部分: 现在你手前的计算机就是一台服务器,当你进入命令行,执行telnet命令后,它同时又是一台客 户机;这样,本地的ip地址可以用”localhost”这个词代码,当然不包括双引号:
问题:
1.服务器连结一个用户退出后不能连结下一个用户。
解决方法:让服务器循环等待。
while (true) {// 让服务器处循环等待状态
Socket client = server.accept();
......
}
2.服务器不能同时连结多个用户。
解决方法:多线程服务器
当一个用户连结进来,就生成一个线程对象处理client对象。
代码部分
两个类,一个创建服务器类,一个服务器的线程类
创建服务器类
/**
* 服务器端处理与客户机连结对象的线程类对象的线程类封装
*/
public class TestServer extends Thread {
/**
* 在制定端口上启动一个服务器
*
* @throws IOException
* @throws 服务器所以的端口
*/
public void setUpServer(int port) throws Exception {
// 1.建立绑定在制定端口上的服务器对象
ServerSocket server = new ServerSocket(port);
System.out.println("创建服务器成功" + port);
// 等待客户机连结进入,进入后,生成一个Socket对象
while (true) {// 让服务器处循环等待状态
Socket client = server.accept();
ServerThread st = new ServerThread(client);
st.start();
System.out.println("我已经启动了一个线程去处理这个对象了");
}
}
public static void main(String[] args) throws Exception {
TestServer ts = new TestServer();
ts.setUpServer(9090);
}
}
服务器线程类
public class ServerThread extends Thread{
private Socket client;//线程对象要处理的连结变量
private OutputStream out;//输出流对象
/**创建这个线程类对象时,传入一个它要处理的对象*/
public ServerThread(Socket sc){
this.client=sc;
}
//将发送消息的代码包装到一个方法中
public void sendMsg2Me(String msg) throws Exception{
byte[] data = msg.getBytes();
out.write(data); //用输出对象发送!
out.flush();//强制输出
}
public void run(){
//在线程run中调用处理连结的方法
try {
processChat(this.client);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 处理连接对象;读取客户机发来的字符串,回送给客户机
*
* @param client:与客户机连结的对象
* @throws IOException
*/
//处理客户机的连结对象
private void processChat(Socket client) throws Exception{
out=client.getOutputStream();//得到一个输出/输入流对象
InputStream ins =client.getInputStream();
String s ="你好,欢迎来到服务器!\r\n";
this.sendMsg2Me(s);
String inputS=readString(ins);
while(!inputS.equals("bye")){
s="我收到了你的话啦"+inputS+"\r\n";
this.sendMsg2Me(s);//将这个字符串发送给客户机对象
inputS=readString(ins);//再次读取
}
s="你好,欢迎再来!\r\n";
this.sendMsg2Me(s);
client.close();
}
/**
* 从输入流对象中读取字节,拼成一个字符串反加
* 如果读到一个字节值为13,则认为以前的是一个字符串
* @param ins:输入流对象
* @return:从流上(客户机发来的)读到的字符串
* @throws Exception
*/
private String readString(InputStream ins) throws Exception{
StringBuffer stb = new StringBuffer();//创建一个字符缓冲区
char c=0;
while(c!=13){
//遇到一个换行,就是一句话
int i = ins.read();//读取客户机发来的一个字节
c=(char)i;//将输入的字节转换成一个Char
stb.append(c);
}
//将读到的字节组转为字符串
String inputS=stb.toString().trim();
return inputS;
}
}