几个概念:客户端 服务器 端口
①客户端
②服务器
③端口:客户端进入服务器的门(通俗解释~),有0-2^16个
目标:实现简单的客户端和服务器短的交互
准备工作:
①开启telnet:控制面板→程序→程序与功能→打开或关闭windows功能
②得到本机的IP:cmd输入ipcongif,在联网的情况下可以获得本机的IP值
步骤:
1.创建服务器:
java.net.ServerSocket 创建一个服务器对象
要捕捉异常:端口可能被占用或者超出端口范围
要有一个开放的端口
2.创建客户端:
客户端对象 java.net.Socket
创建了服务器后,服务器一直处于待机状态
服务器对象server的方法server.accept() 会返回一个Socket类型的对象当且仅当有客户端与服务器端相连接的时候才会执行
代码: 可以简单的理解为客户端连接上了服务器
Socket client = server.accept();
3.实现交互:输入流和输出流
因为要实现交流,需要输入输出流 通过client得到
输入流是用来:客户端得到的
输出流是用来:在服务器端输出的
4.测试:程序运行后,服务器端处于待机状态
开启cmd:telnet+IP+端口号 IP可以直接为127.0.0.1 127.0.0.1是回送地址,指本地机,一般用来测试使用
5.在关闭cmd但是未关闭程序时,程序会死循环输出-1
public class ChatServer {
/**
* 创建服务器对象
*/
public void creatServer(){
try {
//创建服务器对象,并开放2638端口,要捕捉异常
ServerSocket server = new ServerSocket(2638);
System.out.println("服务器创建成功");
//创建客户端
Socket client = server.accept();
InputStream ins = client.getInputStream();
OutputStream outs = client.getOutputStream();
String s = "Hello World!";
outs.write(s.getBytes());
//t 客户端读到的 t=13为回车键
int t = ins.read();
while(t!=13){
System.out.println("客户端输入"+ t);
t = ins.read();
}
if(t==13){
System.out.println("链接断开");
}
client.close();//链接断开
} catch (Exception e) {
e.printStackTrace();
}
}
}
用上述方法创建的服务器,只能在客户端输入一句话就断开,而且客户端收到的还是键盘的编码,不是输入的内容,因此作出改进,先要解决以下两个问题:
1.发出一条消息就退出:
设置服务器循环等待:可以设置一个标签flag,当其为0的时候就进入等待状态;
while(flag==0){
Socket client = server.accept();
}
2.解决服务器端收到的是数字而不是字符串的问题:
创建一个StringBuffer对象stb,它类似于一个String的缓冲区或者理解为可变的字符串,通过一个append方法,可以将字符添加到StringBuffer对象中去
输入流InputStream得到的是输入的键盘编码,是int类型的,将它强制转化为char类型之后,把它添加到stb的后面
/**
* 字符串的读取方法
* @param ins 获取键盘输入
* @return 返回键盘输入的字符串
*/
public String readString(InputStream ins){
try {
//创建一个字符串缓冲区
StringBuffer stb = new StringBuffer();
char c = 0;
while(c!=13){
int i;
i = ins.read();
c = (char)i;
stb.append(c);
}
//将StringBuffer类转化为String
//trim()是字符串的一个方法,去掉开始和结尾的空格
String temp = stb.toString().trim();
return temp;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}