Java网络编程——基于TCP的Socket编程

原创 2016年05月31日 15:36:13

一、基于TCP的Socket通信

1、TCP协议:TCP协议是面向连接的、可靠的、有序的,以字节流方式传输数据的通信协议。客户端与服务器要想实现通信,首先需要建立连接。

2、Java提供的基于TCP协议实现网络通信的类为:客户端的Socket类、服务器端的ServerSocket类。

3、Socket通信模型,见下图(摘自慕课网)


4、Socket通信的实现步骤:

(1)创建ServerSocket和Socket对象

(2)打开Socket的输入/输出流

(3)从输入/输出流中读/写数据

(4)关闭相关资源


二、Socket编程实例

1、非多线程的情况

服务器端:

ServerDemo.java

public class ServerDemo {
	public static void main(String[] args) throws IOException {
		ServerSocket server = null;
		Socket client = null;
		InputStream in = null;
		InputStreamReader reader = null;
		BufferedReader bufReader = null;
		OutputStream out = null;
		PrintWriter writer = null;
		
		try {
			//1、创建服务器端socket,并绑定9999端口,绑定端口之后,服务器一直监听9999端口的请求
			server = new ServerSocket(9999);
			System.out.println("------服务器已启动,等待客户端信息------");
			//2、服务器端接收到客户端的请求,建立连接
			client = server.accept();
			
			//3、将客户的请求数据以输入流的形式读取出来
			in = client.getInputStream();
			reader = new InputStreamReader(in);
			bufReader = new BufferedReader(reader);
			String msg = null;
			while((msg = bufReader.readLine()) != null) {
				System.out.println("收到客户端的信息:" + msg);
			}
			//4、关闭输入流
			client.shutdownInput();
			
			//5、通过输出流向客户端发送信息
			out = client.getOutputStream();
			writer = new PrintWriter(out);
			writer.write("我是服务器,我已经收到了你的信息!");
			writer.flush();
			//6、关闭输出流
			client.shutdownOutput();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//7、程序最后一定要关闭资源
			if(in != null)
				in.close();
			if(reader != null) 
				reader.close();
			if(bufReader != null)
				bufReader.close();
			if(out != null)
				out.close();
			if(writer != null)
				writer.close();
			if(client != null)
				client.close();
			if(server != null)
				server.close();
		}
	}
}
客户端:

ClientDemo.java

public class ClientDemo {
	public static void main(String[] args) throws IOException {
		Socket client = null;
		InputStream in = null;
		InputStreamReader reader = null;
		BufferedReader bufReader = null;
		OutputStream out = null;
		PrintWriter writer = null;
		
		try {
			 //1、新建客户端socket,指明需要连接的服务器地址和端口号
			 //如果是本机,地址可以是localhost或者127.0.0.1
			client = new Socket("localhost", 9999);
			System.out.println("------客户端准备与服务器端建立连接------");
			
			//2、建立连接后通过输出流向服务器端发送信息
			out = client.getOutputStream();
			writer = new PrintWriter(out);
			writer.write("我是客户端,你收到我的请求了吗?");
			writer.flush();
			//3、关闭输出流
			client.shutdownOutput();
			
			//4、将服务器端的响应以输出流的形式读取出来
			in = client.getInputStream();
			reader = new InputStreamReader(in);
			bufReader = new BufferedReader(reader);
			String msg = null;
			while((msg = bufReader.readLine()) != null) {
				System.out.println("收到服务器的应答:" + msg);
			}
			//5、关闭输出流
			client.shutdownInput();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//6、程序的最后一定要关闭资源
			if(in != null)
				in.close();
			if(reader != null) 
				reader.close();
			if(bufReader != null)
				bufReader.close();
			if(out != null)
				out.close();
			if(writer != null)
				writer.close();
			if(client != null)
				client.close();
		}
	}
}

2、多线程的情况(即一个服务器端可以不断接收多个客户端的请求)

服务器端入口:

ServerThreadMain.java

public class ServerThreadMain {
	public static void main(String[] args) {
		ServerSocket server = null;
		Socket client = null;
		try {
			server = new ServerSocket(9999);
			System.out.println("------服务器已启动,等待客户端信息------");

			while(true) {
				client = server.accept();
				ServerThread thread = new ServerThread(client);
				thread.start();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

这里写了一个死循环,代表服务器端一直接收客户端的请求,每接收到一个客户端请求,服务器端会新启一个线程进行处理。

代表服务器端核心处理的线程:

ServerThread.java

public class ServerThread extends Thread {
	public Socket client;
	
	public ServerThread(Socket client) {
		this.client = client;
	}
	
	public void run() {
		InputStream in = null;
		InputStreamReader reader = null;
		BufferedReader bufReader = null;
		OutputStream out = null;
		PrintWriter writer = null;
		
		try {			
			in = client.getInputStream();
			reader = new InputStreamReader(in);
			bufReader = new BufferedReader(reader);
			String msg = null;
			while((msg = bufReader.readLine()) != null) {
				System.out.println("收到客户端的信息:" + msg);
			}
			client.shutdownInput();
			
			out = client.getOutputStream();
			writer = new PrintWriter(out);
			writer.write("我是服务器,我已经收到了你的信息!");
			writer.flush();
			client.shutdownOutput();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(in != null)
					in.close();
				if(reader != null) 
					reader.close();
				if(bufReader != null)
					bufReader.close();
				if(out != null)
					out.close();
				if(writer != null)
					writer.close();
				if(client != null)
					client.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
客户端代码与非多线程的客户端代码相同,不再赘述。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JAVA基础再回首(二十八)——网络编程概述、IP地址、端口号、TCP和UDP协议、Socket、UDP传输、多线程UDP聊天

JAVA基础再回首(二十八)——网络编程概述、IP地址、端口号、TCP和UDP协议、Socket、UDP传输、多线程UDP聊天 版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://bl...

JAVA基础再回首(二十八)——网络编程概述、IP地址、端口号、TCP和UDP协议、Socket、UDP传输、多线程UDP聊天

转自: http://blog.csdn.net/m366917 网络编程概述 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。 有人说,2...

[网络编程]——TCP_Socket通信_聊天室_客户端多线程.初步形成

/** * 创建服务器,加入多线程 * 写出数据:输出流 * 读取数据:输入流 * @author Administrator * */ /** * 创建服务器 * 写出数据:输出流 ...

Java-网络编程(IP地址)-(TCP和UDP)-(Socket)-(Udp-发送端)-(Udp-接收端)

需求:通过udp传输方式,将一段文字数据发送出去 定义一个udp发送端 思路: 1,建立udpsocket服务 2,提供数据,并将数据封装到数据包中 3,通过socket...

java 网络编程(Socket) TCP/UDP 总结案例

网络编程:关注的是底层的数据传输 网页编程:数据的展示 1、基本概念 一、网络:将不同的计算机连接在一起局域网 城域网 互联网 二、地址:Ip地址确定网络上的绝对的地址位置  à房子的地址 三、...

黑马程序员--Java基础学习之网络编程(TCP、UDP、Socket、模拟发送和接收数据)

网络传输过程: 1,找到对方ip 2,数据发送到指定端口(每个应用程序对应一个端口) 3,定义通信规则,即协议   TCP/IP UDP 1,面向无连接,将数据、源、目的封装(像邮递东西) 2,数据...

Java网络编程的知识点 Socket TCP UDP

网络编程: 网络模型 OSI参考模型: 应用层:将数据封装一下                  ...

初识Java TCP/IP Socket-UDP网络编程知识

Java 通过 DatagramPacket 类和 DatagramSocket 类来使用 UDP 套接字,客户端和服务器端都通过DatagramSocket 的 send()方法和 receive(...

网络编程_TCP_Socket通信原理_多个客户端_聊天室原理JAVA189-190

一、S02E189_01网络编程_TCP_Socket通信原理二、S02E190_01网络编程_TCP_Socket通信、多个客户端、聊天室原理
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)