说到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. C# 在本地创建文件夹及子文件夹

    string dict = @"d:\估价报告\"; if (!Directory.Exists(dict)) { Directory.CreateDirectory(dict); ...

  2. [译]Java 设计模式之迭代器

    (文章翻译自java-design-pattern-iterator) 迭代器模式用于迭代遍历一个集合对象.它是一个经常被用到的模式,你可能以前使用过它.不管在任何时候你看见一些方法像hasNext( ...

  3. 批处理中set截取字符具体解释

    set截取字符具体解释  在批处理中,set的功能有点繁杂:设置变量.显示环境变量的名及值.做算术运算.等待用户的输入.字符串截取.替换字符串,是我们经常使用的命令之中的一个. 在字符串截取方面,新手 ...

  4. javascript模拟title提示效果

    本代码可以实现如下情况: 1.js实现title是为了解决自定义样式和格式! 2.希望传入的格式可以不限制是否包含html结构! 3.可以自定义显示层的位置! js如下: function GetAb ...

  5. Memcache存储大量数据的问题

    Memcache存储大数据的问题  huangguisu Memcached存储单个item最大数据是在1MB内,假设数据超过1M,存取set和get是都是返回false,并且引起性能的问题. 我们之 ...

  6. Android项目---HtmlParse

    在解析网站上的内容的时候,总会出现很多html的标签,一般在遇到这种数据的时候,就可以用上Html 如: content.setText(Html.fromHtml("<html> ...

  7. ADFS 2.0 配置简介 PartⅡ – 配置 ADFS 信任关系

    ADFS 与应用程序间的各种验证是基于信任关系的,在 ADFS 服务器配置好要信赖的应用程序(以 URL 为标识)后,应用程序再通过指定认证服务器来将用户引导至 ADFS 登录页,登录完成后再将用户的 ...

  8. PBKDF2WithHmacSHA1算法

    主要用于明文密码加密字符串存入数据库.由棱镜门思考.目前大部分企业中都是明文密码.一旦被攻破.危害非常大.现在主流加密技术是MD5加密.不过MD5的存在小概率碰撞(根据密码学的定义,如果内容不同的明文 ...

  9. cvs vss svn和git比较

    cvs vss svn和git比较 特征 CVS Git Mercurial Subversion 是否原子提交 CVS: 没有. CVS提交不是原子的 Git: 是的. 提交都是原子的 Mercur ...

  10. IOS UI 第四篇:基本UI

    ViewController 应用   再第一个XIB页面创建另一个XIB页面,并且通过按钮调用它     - (IBAction)GoSecond:(id)sender {    secondVie ...