Socket通信原理与实践

1.什么是Socket?

  Socket(套接字),用来描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发送请求和应答请求!,Socket支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示,包含进行网络通信的所必须的五种信息:协议本机IP本地端口远地主机IP远地主机端口


2.Socket通信模型


3.服务端的编写

package JayKing.WebDesign.Study;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

/**
 * 服务端实现类
 * @author JayKing
 */
public class MyServer implements Server {
	String info;
	String[] sendinfo = { "你好", "早上好", "中午好", "good morning" };

	@Override
	public void Response(Socket con) {
		try {

			OutputStream out = con.getOutputStream();
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
			int ramdom = (int) (Math.random() * sendinfo.length);
			String time=new Date().toString();
			bw.write(sendinfo[ramdom]+"\t"+time);
			bw.flush();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	@Override
	public void Request(Socket con) {

		try {
			InputStream in = con.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(in,
					"gbk"));
			char buf[] = new char[1024];
			while (br.read(buf) != -1) {
				info = new String(buf) + info;
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	@Override
	public void closeCon(Socket con) {
		try {
			con.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	@Override
	public Socket AcceptCon(int port) {
		Socket con = null;// socket是表示网络连接的对象
		try {
			@SuppressWarnings("resource")
			ServerSocket serverSocket = new ServerSocket(port);// 绑定端口。
			boolean flag = true;
			while (flag) {
				con = serverSocket.accept();// 等待连接
				if (con != null) {
					Request(con);
					Response(con);
					closeCon(con);
				}

			}

		} catch (IOException e) {
			e.printStackTrace();
		}
		return con;
	}

	public void tellEveryone(String info, Socket con) {
		try {

			OutputStream out = con.getOutputStream();
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
			bw.write(info);
			bw.flush();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

4.客户端的编写

package JayKing.WebDesign.Study;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;

/**
 * 客户端实现类
 * 
 * @author JayKing
 * 
 */

public class ClientA implements Client {

	@Override
	public Socket doCon(String host, int port, String info) {
		Socket con = null;
		try {
			con = new Socket(host, port);// 创建连接
			Request(con, info);
			con.shutdownOutput();// 不加则会出现死锁现象
			Response(con);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return con;
	}

	@Override
	public void Response(Socket con) {
		try {
			InputStream in = con.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(in));
			char buf[] = new char[48];
			System.out.print("服务端的信息:");
			while (br.read(buf) != -1) {
				System.out.print(new String(buf));
			}

			br.close();

		} catch (IOException e) {

			e.printStackTrace();
		}

	}

	@Override
	public void Request(Socket con, String info) {
		try {
			Writer writer = new OutputStreamWriter(con.getOutputStream());
			writer.write(info);
			writer.flush();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	@Override
	public void close(Socket con) {
		try {
			con.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
    注意这里应该关掉输出流,不然会造成客户端输出流没有关闭,而服务端则认为客户端没有关闭,出现客户端一直有输出流,而服务端则一直等待,从而造成死锁!

猜你喜欢

转载自blog.csdn.net/qq_32951553/article/details/79609949