基于TCP协议的网络编程(ServerSocket & Socket)

1.通过ServerSocket模拟服务器端

package com.java.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 基于TCP协议
 * 模拟服务器
 * @author qiuzhiwen
 *
 */
public class Server {
	public static void main(String[] args) {
		System.out.println("服务器正在启动中,等待客户端连接......");
		ServerSocket serverSocket=null;
		Socket socket=null;
		InputStream is=null;
		InputStreamReader isr=null;
		BufferedReader br=null;
		try {
			//1.创建ServerSocket实例并指定端口
			serverSocket=new ServerSocket(8888);
			//2.通过accept()方法阻塞等待客户端连接,同时产生一个Socket实例
			socket=serverSocket.accept();
			//3.通过Socket实例获取字节输入流
			is=socket.getInputStream();
			//4.将字节输入流转为字符输入流,提高读取效率
			isr=new InputStreamReader(is);
			//5.将字符流放到缓冲区
			br=new BufferedReader(isr);
			String msg=null;
			//6.循环读取客户端发送的信息并处理
			while((msg=br.readLine())!=null) {
				System.out.println("我是服务器,客户端说:"+msg);
			}
			//7.关闭输入流
			socket.shutdownInput();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {//8.关闭流资源
				try {
					if(br!=null)
						br.close();
					if(isr!=null)
						isr.close();
					if(is!=null) 
						is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
}

2.通过Socket模拟客户端

package com.java.tcp;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 模拟客户端
 * @author qiuzhiwen
 *
 */
public class Client {
	public static void main(String[] args) {
		System.out.println("客户端正在启动.......");
		Socket socket=null;
		OutputStream os=null;
		PrintWriter pw=null;
		try {
			//1.创建Socket实例并指定IP和端口
			socket=new Socket("127.0.0.1", 8888);
			//2.通过Socket实例获取输出流
			os=socket.getOutputStream();
			//3.创建打印流
			pw=new PrintWriter(os);
			//4.将消息写入打印流
			pw.write("你好,服务器!");
			//5.刷新打印流缓冲
			pw.flush();
			//6.关闭输出流
			socket.shutdownOutput();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {//7.关闭资源
				try {
					if(pw!=null)
						pw.close();
					if(os!=null)
						os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
}

*******************************************************升级**********************************************************************************************

多个客户端与服务器进行通信,并且服务器要给客户端进行响应,同时记录客户端连接数!

1.服务器端

package com.java.tcp;

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.InetAddress;
import java.net.Socket;

/**
 * 多线程下的服务器端
 * @author qiuzhiwen
 *
 */
public class ThreadServer implements Runnable{

	Socket socket=null;
	
	public ThreadServer(Socket socket) {
		this.socket=socket;
	}
	
	@Override
	public void run() {
		InputStream is=null;
		InputStreamReader isr=null;
		BufferedReader br=null;
		OutputStream os=null;
		PrintWriter pw=null;
		try {
			is=socket.getInputStream();
			isr=new InputStreamReader(is);
			br=new BufferedReader(isr);
			InetAddress ia=socket.getInetAddress();
			String msg=null;
			//循环读取客户端发送的信息
			while((msg=br.readLine())!=null) {
				System.out.println(ia.getHostName()+"说:"+msg);
			}
			socket.shutdownInput();//关闭输入流
			
			os=socket.getOutputStream();
			pw=new PrintWriter(os);
			pw.write("Hello "+ia.getHostName());
			pw.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
				try {
					if(br!=null)
						br.close();
					if(isr!=null)
						isr.close();
					if(is!=null)
						is.close();
					if(pw!=null)
						pw.close();
					if(os!=null)
						os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}

}

2.模拟客户端

package com.java.tcp;

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.InetAddress;
import java.net.Socket;

/**
 *  多线程下的客户端
 * @author qiuzhiwen
 *
 */
public class ThreadClient implements Runnable{

	Socket socket=null;
	
	public ThreadClient(Socket socket) {
		this.socket=socket;
	}
	
	@Override
	public void run() {
		OutputStream os=null;
		PrintWriter pw=null;
		
		InputStream is=null;
		InputStreamReader isr=null;
		BufferedReader br=null;
		try {
			os=socket.getOutputStream();
			pw=new PrintWriter(os);
			InetAddress ia=socket.getLocalAddress();
			pw.write("我是"+ia.getHostName()+",你好,服务器!");
			pw.flush();
			socket.shutdownOutput();
			
			is=socket.getInputStream();
			isr=new InputStreamReader(is);
			br=new BufferedReader(isr);
			String msg=null;
			while((msg=br.readLine())!=null) {
				System.out.println("服务器说:"+msg);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
				try {
					if(pw!=null) 
						pw.close();
					if(os!=null)
						os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
		
	}

}

3.服务器端启动类

package com.java.tcp;

import java.net.ServerSocket;
import java.net.Socket;

public class ThreadServerMain {

	public static void main(String[] args) {
		
		ServerSocket serverSocket=null;
		Socket socket=null;
		int count=0;//记录客户端连接数
		try {
			System.out.println("服务器已启动,等待客户端连接......");
			serverSocket=new ServerSocket(8888);
			while(true) {
				socket=serverSocket.accept();
				new Thread(new ThreadServer(socket)).start();
				count++;
				System.out.println("客户端连接数:"+count);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

4.客户端启动类

package com.java.tcp;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class ThreadClientMain {
	
	public static void main(String[] args) {
		
		Socket socket=null;
		try {
			System.out.println("客户端已启动......");
			socket = new Socket("127.0.0.1", 8888);
			new Thread(new ThreadClient(socket)).start();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}

}

 

你可能感兴趣的:(TCP/IP)