Java编程实现多线程TCP服务器完整实例
Socket
·功能:TCP客户端套接字
·构造方法: Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号·常用方法: 1.getInetAddress 获得InetAddress的相关信息 2.getInputStream 获得此TCP连接的输入流 3.getOutPutStream 获得此TCP连接的输出流·功能: TCP服务端套接字
·构造方法: ServerSocket(int port) 创建绑定到特定端口的服务器套接字。·常用方法: 1.accept 获得TCP连接的客户端的socket 2.isClosed 获得ServerSocket的关闭状态TCP服务器端
TcpServer.java
服务器端采用多线程的方式,每建立一个连接就启动一个java线程,发送图片给客户端,之后关闭此TCP连接
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
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编程思想第四版完整中文高清版.pdf
Java编程思想第四版完整中文高清版.pdf 链接: https://pan.baidu.com/s/1vV5BHF3L-bnaG6WGurdJ_A 提取码: vigy 复制这段内容后打开百度网盘手机 ...
- 《Java编程思想第四版完整中文高清版.pdf》-笔记
D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long ...
- 进阶Java编程(1)多线程编程
Java多线程编程 1,进程与线程 在Java语言里面最大的特点是支持多线程的开发(也是为数不多支持多线程的编程语言Golang.Clojure方言.Elixir),所以在整个的Java技术学习里面, ...
- 黑马程序员:Java编程_多线程
=========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路 ...
- 进阶Java编程(4)多线程深入话题
多线程深入话题 1,优雅的停止线程 在多线程操作之中如果要启动多线程使用的肯定是Thread类中的start()方法,而如果对于多线程需要进行停止处理,Thread类原本提供有stop()方法,但是这 ...
- [高清] Java编程思想第四版完整中文高清版
------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...
- 《Java编程思想第四版》附录 B 对比 C++和 Java
<Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...
- python day 20: 线程池与协程,多进程TCP服务器
目录 python day 20: 线程池与协程 2. 线程 3. 进程 4. 协程:gevent模块,又叫微线程 5. 扩展 6. 自定义线程池 7. 实现多进程TCP服务器 8. 实现多线程TCP ...
- Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为 ...
随机推荐
- IDEA中,将项目加入maven管理。
在项目上右键->Add Framework Support Choose Maven 生成pom.xml 在<project>下配置国内仓库 <properties>&l ...
- mysql 中启动服务的命令 、登录命令、退出命令 mysql 的常用命令
1.cmd 以管理员执行 下面命令 启动服务 :net start mysql57 关闭 服务:net stop mysql57 查看mysql 的版本信息 : mysql -V 指定主机地址登录: ...
- docker与虚拟机的区别
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- 原生js简单轮播图 代码
在团队带人,突然被人问到轮播图如何实现,进入前端领域有一年多了,但很久没自己写过,一直是用大牛写的插件,今天就写个简单的适合入门者学习的小教程.当然,轮播图的实现原理与设计模式有很多种,我这里讲的是用 ...
- 面试简单整理之mybatis
125.mybatis 中 #{}和 ${}的区别是什么? 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解 ...
- python 09 文件操作
一 流程: #1. 打开文件,得到文件句柄并赋值给一个变量 #2. 通过句柄对文件进行操作 #3. 关闭文件 二 例子 #1. 打开文件,得到文件句柄并赋值给一个变量f=open('a.txt','r ...
- HTML5-之workers(多线程执行)
注:test.js 不涉及DOM元素
- mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...
- ntelliJ IDEA 仿照vs2017快捷键设置,以及字体颜色设置
因后期工作需要使用java技术栈,所以近期抽空下载了intelliJ IDEA工具,但是作为一个Net开发者,在使用了vs以后,感觉在使用别的开发工具感觉就是没法和vs相比,毕竟vs被称为宇宙最强id ...
- Greenplum 日常维护手册 (汇总、点评、备查)
1. 数据库启动:gpstart常用可参数: -a : 直接启动,不提示终端用户输入确认-m:只启动master 实例,主要在故障处理时使用2. 数据库停止:gpstop:常用可参数:-a:直接停止, ...