几个概念:客户端 服务器 端口
①客户端
②服务器
③端口:客户端进入服务器的门(通俗解释~),有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;
		}
	}