Java编程实现多线程TCP服务器完整实例

 更新时间:2018年01月05日 11:38:33   作者:GavinZhou_xd  
这篇文章主要介绍了Java编程实现多线程TCP服务器完整实例,具有一定借鉴价值,需要的朋友可以参考下

相关Java类

Socket

public class Socket extends Object

·功能:TCP客户端套接字
·构造方法: 
  Socket(InetAddress address, int port) 
  创建一个流套接字并将其连接到指定 IP 地址的指定端口号
·常用方法: 
  1.getInetAddress 
  获得InetAddress的相关信息
  2.getInputStream 
  获得此TCP连接的输入流
  3.getOutPutStream 
  获得此TCP连接的输出流

ServerSocket

public class ServerSocket extends Object

·功能: TCP服务端套接字
·构造方法: 
  ServerSocket(int port) 
  创建绑定到特定端口的服务器套接字。
·常用方法: 
  1.accept 
  获得TCP连接的客户端的socket
  2.isClosed 
  获得ServerSocket的关闭状态

TCP服务器端

TcpServer.java

服务器端采用多线程的方式,每建立一个连接就启动一个java线程,发送图片给客户端,之后关闭此TCP连接

package cn.xidian.tcpSocket;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer extends Thread{
	Socket clientSocket;
	public TcpServer(Socket clientSocket) {
		super();
		this.clientSocket = clientSocket;
	}
	@Override
	  public void run() {
		try {
			//获得客户端的ip地址和主机名
			String clientAddress = clientSocket.getInetAddress().getHostAddress();
			String clientHostName = clientSocket.getInetAddress().getHostName();
			System.out.println(clientHostName + "(" + clientAddress + ")" + " 连接成功!");
			System.out.println("Now, 传输图片数据...........");
			long startTime = System.currentTimeMillis();
			//获取客户端的OutputStream
			OutputStream out = clientSocket.getOutputStream();
			//传出图片数据
			FileInputStream in = new FileInputStream(new File("/home/gavinzhou/test.jpg"));
			byte[] data = new byte[4096];
			int length = 0;
			while((length = in.read(data)) != -1){
				out.write(data, 0, length);
				//写出数据
			}
			long endTime = System.currentTimeMillis();
			//提示信息
			System.out.println(clientHostName + "(" + clientAddress + ")" + " 图片传输成功," + "用时:" + ((endTime-startTime)) + "ms");
			//关闭资源
			in.close();
			clientSocket.close();
			System.out.println("连接关闭!");
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) throws IOException {
		//建立TCP连接服务,绑定端口
		ServerSocket tcpServer = new ServerSocket(9090);
		//接受连接,传图片给连接的客户端,每个TCP连接都是一个java线程
		while(true){
			Socket clientSocket = tcpServer.accept();
			new TcpServer(clientSocket).start();
		}
	}
}

TCP客户端

TcpClient

package cn.xidian.tcpSocket;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClient {
	public static void main(String[] args) throws IOException {
		// 建立TCP服务
		// 连接本机的TCP服务器
		Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
		// 获得输入流
		InputStream inputStream = socket.getInputStream();
		// 写入数据
		FileOutputStream out = new FileOutputStream(new File("../save.jpg"));
		byte[] data = new byte[4096];
		int length = 0;
		while((length = inputStream.read(data)) != -1){
			out.write(data, 0, length);
		}
		//关闭资源
		out.close();
		socket.close();
	}
}

结果

首先,命令行启动服务器端,之后启动客户端,结果如下:

图片比较小,速度很快!

总结

以上就是本文关于Java编程实现多线程TCP服务器完整实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • Java 创建线程的3种方法及各自的优点

    Java 创建线程的3种方法及各自的优点

    这篇文章主要介绍了Java 创建线程的3种方法及各自的优点,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java List的sort()方法改写compare()实现升序,降序,倒序的案例

    Java List的sort()方法改写compare()实现升序,降序,倒序的案例

    这篇文章主要介绍了Java List的sort()方法改写compare()实现升序,降序,倒序的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Java基础知识之成员变量和局部变量浅显易懂总结

    Java基础知识之成员变量和局部变量浅显易懂总结

    从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰
    2021-09-09
  • SpringBoot 注解事务声明式事务的方式

    SpringBoot 注解事务声明式事务的方式

    springboot使用上述注解的几种方式开启事物,可以达到和xml中声明的同样效果,但是却告别了xml,使你的代码远离配置文件。今天就扒一扒springboot中事务使用注解的玩法,感兴趣的朋友一起看看吧
    2017-09-09
  • spring整合atomikos实现分布式事务的方法示例

    spring整合atomikos实现分布式事务的方法示例

    本文整合了一个spring和atomikos的demo,并且通过案例演示说明atomikos的作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Java中常见的语法糖分享

    Java中常见的语法糖分享

    Java语法糖是指Java编译器在编译Java源代码时所做的一些特殊处理,使得Java源代码在编译后生成的字节码更加简洁、易读、易维护,Java 中有许多常见的语法糖,本文给大家列举了一些常见的例子,需要的朋友可以参考下
    2023-10-10
  • 基于Java实现ssh命令登录主机执行shell命令过程解析

    基于Java实现ssh命令登录主机执行shell命令过程解析

    这篇文章主要介绍了基于Java实现ssh命令登录主机执行shell命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • @Configuration保证@Bean单例语义方法介绍

    @Configuration保证@Bean单例语义方法介绍

    这篇文章主要介绍了SpringBoot中的@Configuration与@Bean注解,在进行项目编写前,我们还需要知道一个东西,就是SpringBoot对我们的SpringMVC还做了哪些配置,包括如何扩展,如何定制,只有把这些都搞清楚了,我们在之后使用才会更加得心应手
    2023-01-01
  • Java中Set&List的迭代器实现步骤解析

    Java中Set&List的迭代器实现步骤解析

    这篇文章主要介绍了Java中Set&List的迭代器实现步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • MyBatis如何实现多表查询(多对一、一对多)

    MyBatis如何实现多表查询(多对一、一对多)

    这篇文章主要给大家介绍了关于MyBatis如何实现多表查询(多对一、一对多)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论