通信基础

编写服务器三步骤
第一步:实例化一个服务器: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表示通信的结束
而在实际的通信过程中 这样的协议却是不可行的 必须要严谨的协议
[code="java"]
//自定一个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代替-----
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值