说到java网络通讯章节的内容,刚入门的学员可能会感到比较头疼,应为Socket通信中一定会伴随有IO流的操作,当然对IO流比较熟练的哥们会觉得这是比较好玩的一章,因为一切都在他们的掌握之中,这样操作起来就显得非常得心应手,但是对于IO本来就不是多熟悉的哥们来说就有一定的困难了,在搞清楚IO流操作机制的同时还必须会应用到Socket通信中去,否则会对得到的结果感到非常郁闷和懊恼,下面就和大家一起分享一下自己遇到一点小麻烦后的感触以及给出的解决办法。

要求:客户端通过Socket通信技术上传本地一个文本文件到服务器端(其实就是代替了手动在控制台输入文本),服务器端将客户端上传的文本保存在另一个文本文件中,保存完成后对客户端发送一个“完成保存”的的通知,客户端显示服务器返回的信息并断开和服务器的连接,至此整个通信结束。

以下分两部分来书写完成此任务的代码:

1、客户端:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientSocket{

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

{

System.out.println("客户端启动了...........");

//1、创建客户端Socket对象同时制定将要连接的服务器的ip地址和端口号

Socket s=new Socket(InetAddress.getByName("192.168.56.4"), 10005);//此处会抛出连接失败的异常,根据自己的需要给出处理办法,这里就直接抛了

                  //2、设置io操作源,这里有多种选择,因为是操作文本文件,所以就选择可以一行一行读取数据的Io输入流BufferedReader

                    BufferedReader brfu=new BufferedReader(new FileReader("client.txt"));

                  //3、设置目的:网络

                 PrintWriter  out=new PrintWriter(s.getOutputStream(),true);//此处也可以选择别的Io输出流,例如:BufferedWriter

                  //4、开始读取文件内容并上传到服务器端

                  String line=null;

                   while((line=brfu.readLine())!=null){

                           out.println(line);

         //此处初学者一定要注意:使用out.print(line);out.flush();也解决不了上传不成功的问题,就是读取文本内容带有回车换行符的原因,如果不使用 out.println(line),当然也可以使用out.print(line+"\r\n")来解决

                     }  

                    s.shutdownOutput();//此方法是经过socket对象封装后的,目的就是告诉服务器自己发送内容操作结束了,避免服务器阻塞等待而不给客户端发送完成信息

             //这里也可以使用发送一个和服务器协商好的结束标示符解决问题,但是那个标示符的选择一定要唯一,并且要做到确保上传文件中不会出现这个标示符(时间的毫秒值)

               //5、创建接受服务器端返回数据的IO输入流

                BufferedReader  brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));

                 //6、输出服务器返回的数据

                  System.out.println("Server data :"+brIn.readLine());

                 //7、关闭资源

                   brfu.close();

                     s.close();//其他的IO流对象不用关闭了,因为它们都依靠s,s关闭就可以了

}

}

2、服务器端

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServersSocket {
          public static void main(String[] args) throws IOException {
                             System.out.println("服务器端启动了....");
                           //1、创建服务器端对象,同时绑定监听的端口号
                          ServerSocket ss=new ServerSocket(10005);
                                 //2、获取客户端对象
                          Socket s=ss.accept();
                           //3、获取客户端ip地址和客户端名称
                           String ip=s.getInetAddress().getHostAddress();
                          String name=s.getInetAddress().getHostName();
                            System.out.println("接受到来自名称为:"+name+" 和ip为:"+ip+"的连接");
                           //4、获取IO数据源
                          BufferedReader brfu=new BufferedReader(new InputStreamReader(s.getInputStream()));
                        //5、设置目的,创建本地的文本文件
                          PrintWriter out=new PrintWriter(new FileWriter("server.txt"),true);

//上面的代码等效于BufferedWriter bw=new BufferedWriter(new FileWriter("server.txt"))

//6、开始保存数据的操作
                                  String line=null;
                               while((line=brfu.readLine())!=null){
                            
                                       out.write(line+"\r\n");
                                     System.out.println(line);
                               }
                   //7、创建服务器端源:网络
                         PrintWriter outSer=new PrintWriter(s.getOutputStream(),true);
                          outSer.println("接受并保存完成!");

//8、关闭IO和网络资源
                                   out.close();
                                      s.close();
                                  ss.close();

}

}

Java基础篇Socket网络编程中的应用实例的更多相关文章

  1. Java : java基础(5) Socket网络编程

    使用 DatagramSocket 创建一个 UDP协议的Socket, 用DatagramPacket创建一个数据包,可以指定ip和端口号以及包的数据,用socket.send()可以发送这个数据包 ...

  2. Java基础教程:网络编程

    Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...

  3. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  4. socket网络编程中read与recv区别

    socket网络编程中read与recv区别 1.read 与 recv 区别 read 原则: 数据在不超过指定的长度的时候有多少读多少,没有数据则会一直等待.所以一般情况下:我们读取数据都需要采用 ...

  5. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

  6. java 基础之--nio 网络编程

    在传统的Java 网络编程中,对于客户端的每次连接,对于服务器来说,都要创建一个新的线程与客户端进行通讯,这种频繁的线程的创建,对于服务器来说,是一种巨大的损耗,在Java 1.4 引入Java ni ...

  7. java架构《Socket网络编程基础篇》

    本章主要介绍Socket的基本概念,传统的同步阻塞式I/O编程,伪异步IO实现,学习NIO的同步非阻塞编程和NIO2.0(AIO)异步非阻塞编程. 目前为止,Java共支持3种网络编程模型:BIO.N ...

  8. Java 基础高级2 网络编程

    1.协议的概念:通信双方事先约定好的通信规则 2七层网络通信协议:应用成,表示层,会话层,传输层,网络层,数据链路层 3.TCP/IP协议:点对点通信,三层握手,安全有保证 4.UDP协议;广播协议, ...

  9. java基础学习总结——网络编程

    一.网络基础概念 首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程.

随机推荐

  1. jQuery百叶窗图片滑块

    超酷的jQuery百叶窗图片滑块实现教程   今天我们要来分享一款基于jQuery的百叶窗焦点图插件,也可以说是图片滑块插件.这种jQuery焦点图插件的应用非常广泛,在早些年前,我们需要用flash ...

  2. SQL Server 2008 允许远程链接,适用于广域网和局域网

    用户在使用SQL Server 2008远程链接时,可能会弹出如下对话框: 在链接SQL服务器时发生网络链接错误或特定实例错误.SQL服务器不存在或者链接不成功.请验证用户名是否正确或SQL服务器是否 ...

  3. 根据首尾字节的tcp分包断包算法

    这个算是我的一点小总结吧,放出来分享给大家,原来在网上找这种算法都找了N久没找到,自己写也是走了许多弯路,就放出来遛一遛吧 大家将就这个看看, 这是其中的一个主要的方法,其余的我就不放出来了,其中的I ...

  4. ASP.NET MVC应用程序处理并发

    为ASP.NET MVC应用程序处理并发 2014-05-14 08:37 by Bce, 694 阅读, 2 评论, 收藏, 编辑 这是微软官方教程Getting Started with Enti ...

  5. 史上最全的Matlab资源电子书教程和视频下载合集【超级推荐】

    收藏吧,网上搜集的,费了老大劲了,推荐给有需要的人,^_^.   MATLAB课件2007北京交通大学.zip 4.87 MB   A Guide to MATLAB for Beginners an ...

  6. Linux下监控磁盘空间的四个命令

    无论是运行简单的Linux桌面还是大型Linux服务器,都需要了解可供应用程序使用的空间,并跟踪系统的磁盘使用情况.下面介绍四个核心命令行命令来管理Linux系统上的介质环境. 一.mount命令 m ...

  7. Moq的使用心得

    Moq的使用心得 1.Moq中Mock Repository时最好是Mock Repository的接口,这样会避免不知名的错误. var mockClubRepository = new Mock& ...

  8. [Usaco2008 Open] Clear And Present Danger 寻宝之路[最短路][水]

    Description     农夫约翰正驾驶一条小艇在牛勒比海上航行.     海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛.一 张藏宝图上说,如果他的路程上 ...

  9. java web项目基础

      listener,filter,servlet的初始化顺序 web.xml中可以配置如下信息: context-param,listener,filter,servlet. 他们的加载顺序和在we ...

  10. elasticsearch文档-modules

    elasticsearch文档-modules modules 模块 cluster 原文 基本概念 cluster: 集群,一个集群通常由很多节点(node)组成 node: 节点,比如集群中的每台 ...