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自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为 ...
随机推荐
- 百度地图缩小后marker点的图标移动
遇到的坑:使用百度地图,当地图缩小时,marker点的自定义图标会出现偏移的问题,marker点的信息窗口会出现闪烁问题. 原因:1.anchor是定位点距离图片左上角的偏移量.如果不给anchor的 ...
- 识别手机浏览器代码【C#和JS两种语言】
C# 识别手机浏览器代码: public static bool MobileBrowserDetect() { bool bismobile = false; try { #region 包含and ...
- CentOS7 下安装GUI图形界面GNOME
在安装Gnome包之前,需要检查一下网络是否有网络(使用ping www.baidu.com) 一.先装X windows,-y表示参数同意所有软件安装操,当出现 Complete!说明这里安装成功了 ...
- nginx学习笔记(二)
nginx变量 Nginx 变量值容器的生命期是与当前正在处理的请求绑定的,而与 location 无关. 通过 set 指令隐式创建的 Nginx 变量.这些变量我们一般称为"用户自定义变 ...
- 记录在Ubuntu 18.04系统中安装Apache, MySQL和PHP环境
虽然我们在Linux VPS.服务器安装WEB环境比较方便,可以选择面板或者一键包,但是有些我们需要深入学习的网友不会选择一键安装,而是会尝试编译安装.这样可以学到一些内在的技术.一般我们较为习惯选择 ...
- pd 注意事项
- Docker安装nexus
一.Nexus3安装 sudo docker search nexus sudo docker pull sonatype/nexus3 sudo docker images sudo docker ...
- keepalived高可用简介与配置
keepalived简介 keepalived介绍 Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP ...
- 浅谈如何获取机器的memory和CPU信息
最近做了一个项目,需要获取机器的CPU和memory的使用情况.花了一些时间网上搜索了一下,自己也做了些测试.总结下来,基本上2种方式:一种是用WMI(2种),另一种是用Performance cou ...
- C语言错题集
1.输入两个int型数a.b,求a/b的商c,不必考虑b为0的情况,输出c(保留两位小数) include<stdio.h> int main() { int a,b; float c; ...