通信基础
程序员文章站
2022-06-16 14:22:03
...
编写服务器三步骤
第一步:实例化一个服务器: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表示通信的结束
而在实际的通信过程中 这样的协议却是不可行的 必须要严谨的协议
第一步:实例化一个服务器: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代替-----