编写服务器三步骤
第一步:实例化一个服务器:SocketServer server=new SocketServer("端口");
第二步:等待服务器的连接client=server.recept();
第三步:实例化输入输出流 outputstream ous=client.getOutputstream();inputstream ous=client.getInputstream();
第四部:开始进入读取程序
五点注意之处
1----要知道 接入一个客户机之后要循环等待 所以要有
while(true)
{---client=server.recept()----}
2----服务器需要同时处理多个客户机 这样必须要用线程来控制
3----读取消息和发送消息时 都应该和客户机定义好规则 以免出错
4----当通信结束时 要及时关闭客户机
5----突然关闭客户机可能陷入死循环要加一行当读入的数据为null时的处理语句;
编写客户机的步骤
第一步:实例化一个客户机Socket socket=new Socket();
第二步:实例化输入输出流 outputstream ous=client.getOutputstream();inputstream ous=client.getInputstream();
第三部:开始进入处理程序
注意之处
1---读取消息和发送消息时 应该定义和服务器一样的规则 以免出错
2---突然关闭客户机可能陷入死循环要加一行当读入的数据为null时的处理语句;
3---及时将收到的消息显示在界面上
---------------示范服务器部分代码------
-----创建服务器 接入客户机 启动线程-----
public class ServerTest {
public static void main(String args[]){
//int port =9090;
ServerTest sever =new ServerTest();
sever.deal(9090);
}
private void deal(int port) {
try {
//第一步 建立服务器
java.net.ServerSocket Server=new java.net.ServerSocket(port);
System.out.println("已创建一个服务器"+port);
while(true){
//第二步 等待客户器的接入 接入之后产生一个Socket对象
java.net.Socket client=Server.accept();
System.out.println("接入连接"+client.getRemoteSocketAddress());
//第三部 启动线程 处理连接对象
SeverThread st=new SeverThread(client);
st.start();
System.out.println("已启动一个线程去处理这个连接对象了");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
--------------线程处理--------
这里利用/r/n来表示一句话的结束 用bye表示通信的结束
而在实际的通信过程中 这样的协议却是不可行的 必须要严谨的协议
//自定一个SeverThread类基础自Thread处理客户机对象
public class SeverThread extends Thread {
// 属性
private Socket client;
java.io.OutputStream ous;
// 构造函数
public SeverThread(java.net.Socket client) {
this.client = client;
}
// 重写run方法
public void run() {
// 调用处理方法
processchat(client);
// 处理方法执行完毕后,线程自己退出
}
private void processchat(Socket client) {
try {
// 得到一个输出/输入流对象
ous = client.getOutputStream();
java.io.InputStream ins = client.getInputStream();
String s = "欢迎进入服务器!\r\n";
sendMsg(s);// 发送消息给客户机对象
String inputS = readString(ins);// 读取客户机发来的消息
while (!inputS.equals("bye")) {
s = "我收到你的话啦" + inputS + "\r\n";
sendMsg(s);// 发送消息给客户机对象
inputS = readString(ins);// 读取客户机发来的消息
}
s = "你好,再见" + "\r\n";
sendMsg(s);// 发送消息给客户机对象
client.close();// 中断连接
} catch (Exception e) {
e.printStackTrace();
}
}
private void sendMsg(String s) throws Exception {
ous.write(s.getBytes());// 将字符串转为字节读入
ous.flush();// 强制输出
}
private String readString(InputStream ins) throws Exception {
StringBuffer stb = new StringBuffer();// 创建一个字符串缓冲区
int i = ins.read();
char c = (char) i;
while (c!='#'){
System.out.println("写入了字符"+c);
stb.append(c);
i = ins.read();
c = (char) i;
}
// 将读到的字节组转化为字符串返回
String inputS = stb.toString().trim();
System.out.println("写入了字符串"+inputS);
return inputS;
}
}
---------这里的客户机部分由cmd代替-----