标签:
package testsocket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; /** * 服务器线程处理类 * * @author Buddha * */ public class ServerThread extends Thread { // 和本线程相关的Socket Socket socket = null; // 带参数的构造方法 public ServerThread(Socket socket) { this.socket = socket; } // 线程执行的操作,响应客户端的请求 public void run() { // 字节输入流 InputStream is = null; // 为了提高读取的性能,将字节输入流进行包装,把它变为字符流 InputStreamReader isr = null; // 为字符流添加缓冲,以缓冲的方式读取 BufferedReader br = null; OutputStream os = null; // 转为打印流 PrintWriter pw = null; // 选中要抛出异常的代码,按shift+alt+z 然后就可以选中try catch,会自动给你抛异常 try { // 3.获取一个输入流,读取客户端信息 is = socket.getInputStream(); isr = new InputStreamReader(is); br = new BufferedReader(isr); // 获取客户端提交的信息 String info = null; // 循环读取客户端提交的信息 // 每次读取一行 while ((info = br.readLine()) != null) { System.out.println("我是服务器,客户端说:" + info); } // 关闭输入流 socket.shutdownInput(); // 4.获取输出流,响应客户端的请求 os = socket.getOutputStream(); pw = new PrintWriter(os); pw.write("欢迎"); pw.flush();// 刷新缓存 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 5.关闭资源 try { //if (pw != null) //对于同一个socket,如果关闭了输出流会导致socket也会被关闭,所以一般不用关闭输出流,直接关闭socket即可。 //pw.close(); if (os != null) os.close(); if (os != null) br.close(); if (isr != null) isr.close(); if (is != null) is.close(); if (socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
package testsocket; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * 基于TCP协议的通信,实现用户登录 * @author Buddha * 服务器端 */ public class Server { public static void main(String[] args) { try { //1.创建一个服务器端Socket,既ServerSocket,指定绑定的端口,并监听此端口 ServerSocket serverSocket =new ServerSocket(8888); Socket socket=null; //记录客户端的数量 int count = 0; //2.调用accept()方法开始监听,等待客户端的链接 System.out.println("=======服务器即将启动,等待客户端的链接======"); //循环监听等待客户端的链接 while(true){ socket=serverSocket.accept(); //创建一个新的线程 ServerThread serverThread=new ServerThread(socket); //设置线程优先级,1-10.默认为5,避免运行时速度慢 serverThread.setPriority(4); //启动线程 serverThread.start(); //统计客户端的数量 count++; System.out.println("客户端的数量:"+count); //获取InetAddress实例 InetAddress address=socket.getInetAddress(); //获取客户端的IP System.out.println("当前客户端的IP:"+address.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } } }
package testsocket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) { try { // 1.创建客户端socket,指定服务器地址和端口 Socket socket = new Socket("localhost", 8888); // 2.获取输出流,向服务器发送信息 // 字节输出流 OutputStream os = socket.getOutputStream(); //将输出流包装为打印流 PrintWriter pw =new PrintWriter(os); pw.write("用户名:admin;密码:123"); //刷新缓存,向服务端输出信息 pw.flush(); //关闭输出流 //不能使用pw.close()来关闭输出流,需要使用socket.shutdownOutput()来关闭当前的输出流,结束数据的输出 socket.shutdownOutput(); //3.获取输入流,并读取服务器端的响应信息 InputStream is=socket.getInputStream(); BufferedReader br= new BufferedReader(new InputStreamReader(is)); String info =null; while((info=br.readLine())!=null){ System.out.println("我是客户端,服务器说"+info); } //4.关闭资源 br.close(); is.close(); pw.close(); os.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // } }
标签:
原文地址:http://www.cnblogs.com/shakyamuni/p/5154348.html