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网络编程实践和总结 --- 基于UDP的Socket编程

前面的blog介绍和总结基于TCP协议的网络编程。TCP提供了一种可靠的传输方式。如果数据在传输过程丢失或者损坏了,TCP会保证数据会再次发送,直到数据完整接受。如果数据包以乱序到达目的地,TCP也会...
  • joeyjobs
  • joeyjobs
  • 2015年04月02日 19:54
  • 1742

java实现的基于TCP网络编程步骤

参考 java 程序设计教程(第二版)雍俊海老师编著的书12章 服务器端程序设计模型的建立通常由如下五个步骤组成: (1)在服务器端,首先要创建ServerSocket的实例对象,注册在服务器端进...
  • u012270113
  • u012270113
  • 2014年03月30日 23:29
  • 2186

基于TCP/IP协议的socket编程

============================================================================= 开发环境:windows 开发工...
  • ZhengNice
  • ZhengNice
  • 2016年05月20日 20:10
  • 1493

wince Socket编程之一

这几天准备好好研究一下网络通讯,研究的对象主要是针对wince的tcp/ip连接.我的PDA是华硕620BT,它的操作系统是2003的,对应的操作系统版本号是4.2.网络通讯用的是无线wifi网卡.书...
  • chNeed1
  • chNeed1
  • 2007年08月26日 18:25
  • 5893

TCP/UDP Socket编程步骤

sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW); WINDOWS环境下TCP/UDP编程步骤: 1....
  • aizquan
  • aizquan
  • 2014年04月05日 15:40
  • 2408

基于Vxworks的Socket编程

近段时间接触一个Vxworks的项目,写了一些关于
  • wtchappy
  • wtchappy
  • 2014年07月06日 12:42
  • 1905

赵雅智_java网络编程(4)TCP/IP、Http和Socket的区别

通过java网络编程(1)网络体系结构及通信协议我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可比性 TPC/IP协议是传输层协议,主要解决...
  • zhaoyazhi2129
  • zhaoyazhi2129
  • 2014年10月24日 10:09
  • 1363

Java 基于UDP的Socket网络编程的入门及示例

前言:天呐!这两天上班就像走钢丝啊,老大家里出事请假一周,手机关机,底层无人照看,机器又忙着定标,技术盲老板事事问我这个底层小白。做人好难呐。。。还是祝愿老大家里没有大碍吧,也保佑自己明天能安然度过。...
  • u014158743
  • u014158743
  • 2016年10月25日 23:16
  • 938

Java 基于TCP的Socket网络编程的入门及示例

前言:各位周末愉快,因匿名台风来袭,窗外又是一波风雨交加,所以又是哪都不想去……话说给我天晴还不是一样窝在家里。。。好了,这篇是总结了tcp的socket,各种例子,应该是比较全了,记在这里,用到时可...
  • u014158743
  • u014158743
  • 2016年10月22日 22:17
  • 962

C#-Socket编程-TCP

服务器端 using System; using System.Collections; using System.Net.Sockets;   //命名空间 using System.Ne...
  • u014800094
  • u014800094
  • 2016年10月27日 13:42
  • 330
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java网络编程——基于TCP的Socket编程
举报原因:
原因补充:

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