0

0

Java基础入门之网络编程教程

巴扎黑

巴扎黑

发布时间:2017-07-21 16:48:09

|

1565人浏览过

|

来源于php中文网

原创

tcp 网络编程

-- tcp 分为客户端和服务端

-- 客户端对应的对象是 Socket

-- 服务端对应的对象是 ServerSocket

-- 如果客户端先启动,则出现 connection refused 异常  //refused 拒绝

立即学习Java免费学习笔记(深入)”;

汽车导购门户整站源码
汽车导购门户整站源码

汽车导购门户网为齐博CMS V7版的基础改编而成的,程序为整站程序,自带3000多数据,安装好在后台恢复数据就可以直接使用哦。 安装前,请必须确认/data/ /cache/目录可写 然后在地址栏目输入安装地址 http://xxx.com/install.php 一步步的安装. blog 博客 wn 万能文章 count 流量统计 exam 考试系统 form 万能表单

下载

客户端创建Socket 对象时,就可以连接服务器,连接成功后,即形成通路,进行数据交换

import java.net.*;import java.io.*;        //TCP客户端class TClient{public static void main(String [] args) throws Exception
            {
                Socket socket=new Socket("127.0.0.1",9000);                //取得 Socket 中的输出流OutputStream out =socket.getOutputStream();
                out.write("这是客户端向主机输出的数据".getBytes());                //取得服务端发回的数据InputStream in=socket.getInputStream();byte [] buff=new byte[1024];int len =in.read(buff);
                String str=new String(buff,0,len);
                System.out.println("服务端返回的数是:"+str);
                
                out.close();
                in.close();
                socket.close();
            }
        }
//TCP服务端/* 1 创建ServerSocket ,指定要监听的端口
         2 通过 ServerSocket 的 accept 方法 (它是阻塞模式的) 取得连接上来的客户端对象
         3 与客户端连通后,就可以得到客户端对象,并使用客户端对象读取流来取得数据
         4 如果有必要,释放资源*/import java.io.*;import java.net.*;class TServer
        {public static void main(String [] args) throws Exception
            {
                ServerSocket serverSocket=new ServerSocket(9000);  //指定监听的端口Socket clientSocket=serverSocket.accept();                //通过客户端的Socket对象可以取得信息String clientIp=clientSocket.getInetAddress().getHostAddress();int clientPort=clientSocket.getPort();
                
                System.out.println(clientIp+":"+clientPort +"连接成功");
                
                InputStream in= clientSocket.getInputStream();byte[] buff=new byte[1024];int len=in.read(buff);  //len 表示读了多少个字节   注意,这个read 是阻塞的                
                String msg=new String(buff,0,len);
                
                System.out.println(msg);                //往回发送数据OutputStream out=clientSocket.getOutputStream();
                out.write("小样的客户端,你竞敢骂人?,我也能".getBytes()); */
                out.close();
                in.close();
                serverSocket.close();
                clientSocket.close();
        
            }
        }

例子 从客户端向服务端发字母,变成大写后反回

/*客户端:
            1 建立服务
            2 获取键盘录入
            3 将数入的数据发给服务端
            4 接收服务端返回的大写字母
            5 关闭资源
            备注: 使用带缓冲的字符流进行操作 */import java.io.*;import java.net.*;class TransClient
        {public static void main(String [] args) throws Exception
            {
                    Socket socket=new Socket("127.0.0.1",8000);                    //定义输入流,读取键盘数据BufferedReader br=new BufferedReader(new InputStreamReader(System.in));                    //定义输出流对象(用于将键盘数据写入到输出流中)BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));                    //定义一个socket 读取流,读取服务器返回的大写字母BufferedReader brResult=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    
                    String str=null;while((str=br.readLine())!=null){ //从键盘开始读取bw.write(str);  //向服务端输出                        bw.newLine();
                        bw.flush(); //千万别忘了                        
                      System.out.println("服务端返回的数据是"+brResult.readLine()); //取出变大写后的字符串                    }
                    
                    socket.close();
                    br.close();
                    bw.close();
                    brResult.close();        
            }
        }
//服务端  import java.net.*;import java.io.*;class TransServer
        {public static void main(String [] args) throws Exception
                {
                     ServerSocket serverSocket=new ServerSocket(8000);
                     Socket clientSocket=serverSocket.accept();                     
                     //读取socket流中的数据(从客户端发过来的小写字母) BufferedReader br=new BufferedReader(new InputStreamReader( clientSocket.getInputStream()));                     
                     //创建输出流对象,往clientSocket 的流中写入转换后的大写字母 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter( clientSocket.getOutputStream()));
                     
                     String str=null;                     while((str=br.readLine())!=null)  //注意 readLine 的特性,它是要一直读取回车换行才返回                     {
                             bw.write(str.toUpperCase());
                             bw.newLine();
                             bw.flush(); //千万别忘了                     }
                     
                    br.close();
                    bw.close();
                    clientSocket.close();
                    serverSocket.close();
                }
        
        }

例子 上传文件

//客户端  import java.io.*;import java.net.*;class UPClient
        {public static void main(String [] args) throws Exception
            {
                    Socket socket=new Socket("127.0.0.1",7000);
                    BufferedReader br=new BufferedReader(new FileReader("C:\作业\名单.txt"));  //用来读文件的输入流BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));  //用来把文件往服务端传                    //往scoket中一行一行的写入数据String content=null;while((content=br.readLine())!=null){
                        bw.write(content);
                        bw.newLine();
                        bw.flush();
                    }
                    
                    socket.shutdownOutput(); //关闭客端的输出流同,当相于加入一个结束标记(-1),要不然服务端会不停的等                                //取出服务端返回的信息BufferedReader brResult=new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
                    System.out.println(    brResult.readLine());
                        
                    bw.close();
                    br.close();
                    socket.close();
            }
        }
//服务端  import java.io.*;import java.net.*;class UPServer
        {public static void main(String [] args) throws Exception
            {
                    ServerSocket serverSocket=new ServerSocket(7000);
                    Socket clientSocket=serverSocket.accept();
                    
                    System.out.println(clientSocket.getInetAddress().getHostAddress()+"已经连接..."); //打印一下客户端连上的的信息                    //读取客户端发过的来的数据BufferedReader br=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                    BufferedWriter bw=new BufferedWriter(new FileWriter("e:/xxx.exe"));
                    
                    String str=null;while((str=br.readLine())!=null){  //如果客户端不发结束标记,它就不会返回                        bw.write(str);
                        bw.newLine();
                        bw.flush();
                    }                    //再向发送端返回一条提示息                    
                    BufferedWriter bwResult=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                    bwResult.write("文件上传成功");
                    bwResult.flush();
                    
                    serverSocket.close();
                    clientSocket.close();
                    bwResult.close();
                    bw.close();
                    br.close();
                        
            }

例子 上传图片

客户端import java.net.*;import java.io.*;class ImgClient
            {public static void main(String [] ars) throws Exception
                    {
                            Socket socket=new Socket("127.0.0.1",7000);
                            FileInputStream fis=new FileInputStream("C:\image\0.jpg");  //文件输入流OutputStream out=socket.getOutputStream();                            byte [] buff  =new byte[1024];int len=0;while((len=fis.read(buff))!=-1){  //一边读数据,一边传数据out.write(buff,0,len);    //字节流,不用flush, 和 newLine()                            }
                            
                            socket.shutdownOutput(); //加一个结束标记,表示输入流结束                            //取出服务端发过来的信息BufferedReader brResult=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                            System.out.println(brResult.readLine());
                            
                            socket.close();
                            fis.close();
                    }
            }
服务端import java.net.*;import java.io.*;class ImgServer
            {public static void main(String [] args) throws Exception
                {
                        ServerSocket serverSocket=new ServerSocket(7000);
                        
                        Socket clientSocket=serverSocket.accept();
                        
                        System.out.println(clientSocket.getInetAddress().getHostAddress()+" 已连接");
                        
                        InputStream in=clientSocket.getInputStream(); //取数据用的流FileOutputStream fos=new FileOutputStream("e:\xxx.jpg");                        byte [] buff=new byte[1024];int len=0;while((len=in.read(buff))!=-1){
                            fos.write(buff,0,len); //不用flush 因为是字节流                        }
                        
                        BufferedWriter br=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                        br.write("图片上传成功");
                        br.flush(); //别忘了                        
                        serverSocket.close();
                        clientSocket.close();
                        br.close();
                        fos.close();    
                }
            }

例子 多线程并发上传图片

服务端     import java.net.*;class PICServer
        {public static void main(String [] args) throws Exception 
                {
                    ServerSocket serverSocket=new ServerSocket(9000);                    while(true)
                    {
                            Socket clientSocket=serverSocket.accept();new Thread(new PICThread(clientSocket)).start();
                    }
                }
        }
import java.io.*;import java.net.*;class PICThread implements Runnable{private Socket clientSocket;public PICThread(Socket socket)
            {
                clientSocket=socket;
            }public void run()
            {try{
                    
                    String clientIp=clientSocket.getInetAddress().getHostAddress();
                    FileOutputStream fos=new FileOutputStream("e:\"+clientIp);
                    InputStream in =clientSocket.getInputStream();  //从套接字中取出数据byte[] buff=new byte[1024];int len=0;while((len=in.read(buff))!=-1)  //把数据从流中读出,写入文件                    {
                         fos.write(buff,0,len);
                    }
                    
                    BufferedWriter br=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                    br.write("图片上传成功");
                    br.flush();
                    
                    
                    clientSocket.close();
                    fos.close();
                    in.close();
                    
                }catch(Exception ex){
                    System.out.println("出错了");
                }            
            }
        }
客户端        import java.io.*;import java.net.*;class PICClient{public static void main(String [] args) throws Exception
            {
                
                   String fileName=args[0];//String fileName="c:\Image\2.jpg";                
                    //进行验证File file=new File(fileName);if(!(file.exists()&&file.isFile()))  //验证文件是不是存在                    {
                        System.out.println("输入的文件名错误或是个目录");return;
                    }                    if( !file.getName().endsWith(".jpg")){
                        System.out.println("文件类型不正确");return ;
                    }                    if( file.length() >1024*1024){
                        System.out.println("你想干啥,整这么大的文件上来? 不行");return; 
                    }
                    
                  Socket socket=new Socket("127.0.0.1",9000);
                
                    FileInputStream fis=new FileInputStream(fileName);  //构建文件输入流OutputStream out=socket.getOutputStream(); //输出流byte [] buff=new byte[1024]; int len=0;while((len=fis.read(buff))!=-1)  //一边读入,一边往文件中写出                    {
                         out.write(buff,0,len);
                    }
                    
                    socket.shutdownOutput();                    //取出服务端发过来的信息BufferedReader brResult=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    System.out.println(brResult.readLine());
                    
                    socket.close();
                    fis.close();
                    brResult.close();
                    out.close();    
            }
        }

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

6

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

6

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

8

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

14

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

17

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

2

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

130

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

8

2026.02.27

AO3官网直接进入
AO3官网直接进入

AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

208

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4万人学习

C# 教程
C# 教程

共94课时 | 10.4万人学习

Java 教程
Java 教程

共578课时 | 74.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号