当前位置: 首页 > news >正文

Java 网络编程 之 TCP协议

TCP协议 (服务器端程先启动,等待客户端连接)

 

TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据

保证传输数据的全性安,文件数据不易丢失

 

JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。

首先创建代表服务器端的ServerSocket对象,并等待客户端的连接,

然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,客户端再次向服务器端发送确认信息,确认连接

 

 

public class TCPClient {//客户端

public static void main(String[] args) throws IOException {

Socket socket=new Socket("127.0.0.1",8888);//客户端对象 建连接

//Socket socket=new Socket(inet,8888);//(地址对象,端口号)

OutputStream out=socket.getOutputStream();//客户端的 输出流

//写数据

Scanner sc=new Scanner(System.in);

String str=sc.nextLine();

out.write(str.getBytes());

//明确数据源

FileInputStream fis=new FileInputStream("F:\\java\\1.jpg");

//BufferedInputStream bis = new BufferedInputStream(fis);

//写数据

int len=0;

byte[] bytes=new byte[1024];

while((len=fis.read(bytes))!=-1){ //bis.read(bytes)

out.write(bytes,0,len); //写入 socket的 输出流

}

socket.shutdownOutput();//socket对象 的输出流 写入结束符

//接收服务器端的响应

InputStream in=socket.getInputStream();

byte[] bytes=new byte[1024];

int len=in.read(bytes);

System.out.println(new String(bytes,0,len));

 

socket.close();//释放内存

fis.close();//关闭数据源

}

}

int port=socket.getPort();//获取端口号

InetAddress inet=getLocalAddress();//获取本地地址对象

 

public class TCPServer {//服务器端

public static void main(String[] args) throws IOException {

ServerSocket server=new ServerSocket(8888);//服务端对象(端口号)

Socket socket=server.accept();//创建连接  获取客户端对象

InputStream in=socket.getInputStream();//客户端的 输入  不关

//读出数据

byte[] bytes=new byte[1024];

int len=in.read(bytes);

System.out.println(new String(bytes,0,len));

 

//明确目的地

File file=new File("F:\\aaa");

if(!file.exists()){ file.mkdirs(); }//文件夹不存在  创建

String fn="oracle"+System.currentTimeMillis()//域名+毫秒值

          +new Random().nextInt(999999)+".jpg";//+六位随机数+后缀

FileOutputStream fos=new FileOutputStream(file+File.separator+fn);

//BufferedOutputStream bos = new BufferedOutputStream(fos);

//开始复制

byte[] bytes=new byte[1024];

int len=0;

while((len=in.read(bytes))!=-1){

fos.write(bytes,0,len); //bos.write(bytes,0,len);

}

//发送给客户端响应

OutputStream out=socket.getOutputStream();//输出流

 

Scanner sc=new Scanner(System.in);

String str=sc.nextLine();

out.write(str.getBytes());//写数据 

out.write("上传成功".getBytes());//写数据

 

server.close();//释放资源

fos.close(); //bos.close();

}

}

InetAddress address = socket.getInetAddress();//获取地址对象

String ip=address.getHostAddress(); //ip地址

String name=address.getHostName(); //主机名

System.out.println("来自IP:"+ip+"主机名:"+name);

 

多线程(多人同时访问服务器)
public class Upload implements Runnable{
    private Socket socket;
    public Upload(){}
    public Upload(Socket socket){this.socket=socket;}
    public void run() {
        FileOutputStream fos=null;
        try{
        InputStream in=socket.getInputStream();//客户端 输入流
        //明确目的地
        File file=new File("F:\\aaa");
        if(!file.exists()){ file.mkdirs(); }//文件夹不存在  创建
        String filename="oracle"+System.currentTimeMillis()//域名+毫秒值
                    +new Random().nextInt(999999)+".jpg";//+六位随机数+后缀
        fos=new FileOutputStream(file+File.separator+filename);
        //开始复制
        byte[] bytes=new byte[1024];
        int len=0;
        while((len=in.read(bytes))!=-1){fos.write(bytes,0,len);}
        //发送给客户端响应
        OutputStream out=socket.getOutputStream();//输出流
        out.write("上传成功".getBytes());//写数据
        }catch(IOException ex){ex.printStackTrace();}
     finally{ if(fos!=null){fos.close();//点try...catch} }
    }
}       

public class TCPThreadServer {//服务器端 多线程  (客户端不变)
    public static void main(String[] args) throws IOException {
        ServerSocket server=new ServerSocket(8888);//服务端对象(端口号)
        while(true){
            Socket socket=server.accept();//创建连接  获取客户端对象 
new Thread(new Upload(socket)).start();
//创建并开启线程 } } }

 

 

转载于:https://www.cnblogs.com/javscr/p/10252744.html

相关文章:

  • java面试题(四)
  • Java将string内容写入到TXT文件
  • 爬虫之图片懒加载技术、selenium和PhantomJS
  • 词云制作没那么难,Python 10 行代码就实现了!
  • D-赌神(判断2^k = n时 k的值)
  • vue-router(hash模式)常见问题以及解决方法
  • 链式存储结构之静态链表
  • js简单实用的垂直导航菜单,鼠标移动触发
  • idea运行提示Error:java:无效的源发行版:1.9
  • zookeeper-3.5.4-beta安装
  • 归一化
  • 深度神经网络多任务学习(Multi-Task Learning in Deep Neural Networks)
  • 实验吧-密码学-疑惑的汉字(当铺密码)
  • 织梦dedecms去除友情链接中的li和span
  • 【Ray Tracing The Next Week 超详解】 光线追踪2-2
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Angular4 模板式表单用法以及验证
  • Git初体验
  • javascript 哈希表
  • Java面向对象及其三大特征
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Linux CTF 逆向入门
  • Python十分钟制作属于你自己的个性logo
  • Python学习之路13-记分
  • React系列之 Redux 架构模式
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Selenium实战教程系列(二)---元素定位
  • SwizzleMethod 黑魔法
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 闭包--闭包之tab栏切换(四)
  • 大型网站性能监测、分析与优化常见问题QA
  • 多线程事务回滚
  • 工作中总结前端开发流程--vue项目
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 鱼骨图 - 如何绘制?
  • 原生 js 实现移动端 Touch 滑动反弹
  • 责任链模式的两种实现
  • 函数计算新功能-----支持C#函数
  • ​用户画像从0到100的构建思路
  • #define
  • #pragam once 和 #ifndef 预编译头
  • $(function(){})与(function($){....})(jQuery)的区别
  • $.ajax中的eval及dataType
  • ${ }的特别功能
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (23)Linux的软硬连接
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (转)h264中avc和flv数据的解析
  • (转)可以带来幸福的一本书
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)