0

0

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

巴扎黑

巴扎黑

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

|

1565人浏览过

|

来源于php中文网

原创

tcp 网络编程

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

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

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

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

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

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

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

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

下载
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();    
            }
        }

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

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

精品课程

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

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.7万人学习

Java 教程
Java 教程

共578课时 | 45.9万人学习

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

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