急求把网络socket输入输出流上的数据存为本地二进制文件的方法,就像MSN、QQ等聊天软件的聊天记录的功能

解决方案 »

  1.   

    过程就是:
    1、得到相应的网络输入流
    InputStream is = ***.getInputStream();
    2、本地创建一个输出流
    FileOutputStream out = new FileOutputStream(file);
    3、写到本地
    while ((i = is.read()) != -1) {
    out.write(i);
    }
    out.flush();
      

  2.   


    import   java.net.*;   
      import   java.io.*;   
    import   java.lang.*;   
        
      public   class   Test   {   
          public   static   void   main(String   args[])   {   
              String   host   =   "192.168.180.20";   
              int   port   =   23,i;   
              Socket   socket;   
              String   s   =   "get   sysLocation";     //要执行的命令(取设备agent内的节点值)   
              InputStream   Is,is = null;   
              OutputStream   Os;   
              DataInputStream   DIS;   
              PrintStream   PS; 
              FileOutputStream out ;
              try {
    socket   =   new   Socket(host,   port);
    } catch (UnknownHostException e2) {
    // TODO 自动生成 catch 块
    e2.printStackTrace();
    } catch (IOException e2) {
    // TODO 自动生成 catch 块
    e2.printStackTrace();

              try {
               
    out= new FileOutputStream(new File("d:\\t"));
    try {
    while ((i = is.read()) != -1) { 
    out.write(i); 
    out.flush();
    }
    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();


    } catch (FileNotFoundException e1) {
    // TODO 自动生成 catch 块
    e1.printStackTrace();
    }             
          }   
      }   
    我是这样写的,可是报空指针异常啊?
    我是想控制台接受键盘输入,然后存为二进制文件,应如何改动啊?
      

  3.   

    InputStream   Is,is = null; 
    while ((i = is.read()) != -1)------空指针异常了。  
      

  4.   

    还有个问题想请教一下,如何把网络socket输入输出流上的数据存为dat类型文件啊?
      

  5.   

    InputStream   Is,is = null;  没有赋值
      

  6.   

    简单的写了一个程序,估计能完成要求。有一些细节方面没有做处理。
    package houlei.test;import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;/**
     * 推荐使用两个线程来处理,本代码是单线程的程序。
     *
     * 该类创建于 2009-6-12 上午02:11:49
     * @version 1.0.0
     * @author 侯磊
     */
    public class RecordIOInfo { public static final String Exit = "exit";

    public static void main(String[] args) throws Exception{
    Socket socket = new Socket("192.168.180.20",23);
    InputStream cIn = System.in;
    InputStream sIn = socket.getInputStream();
    OutputStream sOut = socket.getOutputStream();
    OutputStream fOut = new FileOutputStream("D:\\save.dat");
    boolean running = true;
    try{
    while(running){
    if(cIn.available()>0){//将控制台的信息传输给Socket
    sOut.write(cIn.read());
    }
    if(sIn.available()>0){//将Socket传过来的数据存储到文件当中
    fOut.write(sIn.read());
    }
    Thread.sleep(10);
    }
    }catch(IOException e){
    e.printStackTrace();
    }finally{
    fOut.close();
    socket.close();
    }
    }
    }
      

  7.   

    哦。忘了每次write后要flush了。还有那个常量Exit在这里没有用。
      

  8.   

    小弟先谢谢preferme大哥,不过还是希望能提供下详细的代码,最好是服务器端和客户端分开的那种。如果能用多线程最好了。
      

  9.   

    1.你的需求不明确。缺少太多的信息。
    2.如果只是想传文件,那用FTP会更直接一些,或者HTTP下载也可以。
    3.如果即要服务端有执行客户端命令的功能,又要有传输文件(或数据)的功能,而且还不使用FTP,那必须要写个协议才行。
    4.第3种情况,编程复杂度太大。你出300分,估计也没几个人帮你做。
    5.我写的代码也只是抛砖引玉,仅供楼主参考。
      

  10.   

    我只是想实现MSN等的把聊天记录存到本地文件里的功能而已啊!
    你欺负人~~~~(>_<)~~~~ ,欺负我的人都是坏人/(ㄒoㄒ)/~~~~o(>_<)o ~~~~~~5555555555555~~~~ 
      

  11.   

    比较汗~~~
    你想实现MSN等的聊天记录功能,那也得有具体的聊天程序才行啊,没这样的聊天程序,怎么帮你实现日志的记录功能?
    不会是要我给你编一个聊天程序吧?C/S架构的聊天通讯程序,其实是一个比较复杂的程序。
    其中涉及到大致4个过程,信息的显示,信息的编码组包,信息的传输,以及信息的拆包解码。楼主想要实现聊天内容的记录功能,打算记录哪个过程的聊天信息?其实,我也是比较郁闷滴。
      

  12.   

    是这样的,服务器端不停的给客户端发送数据,而客户端就负责把服务器端发送的数据全部记录到本地(dat类型的)文件里。
      

  13.   


    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;/**
     * 推荐使用两个线程来处理,本代码是单线程的程序。
     * <p/>
     * 该类创建于 2009-6-16 下午03:42:50
     * 
     * @version 1.0.0
     * @author 9sky
     */
    public class RecordIOInfo { private static String Host = "127.0.0.1";// 服务端IP
    private static int Port = 4567;// 服务端监听端口
    private static String FileName = "D:\\save.dat";

    public static void main(String[] args) throws Exception {
    Socket socket = new Socket(Host, Port);
    InputStream cIn = System.in;
    InputStream sIn = socket.getInputStream();
    OutputStream sOut = socket.getOutputStream();
    OutputStream fOut = new FileOutputStream(FileName);
    boolean running = true;
    try {
    while (running) {
    if (cIn.available() > 0) {// 将控制台的信息传输给Socket
    sOut.write(cIn.read());
    sOut.flush();
    }
    if (sIn.available() > 0) {// 将Socket传过来的数据存储到文件当中
    fOut.write(sIn.read());
    fOut.flush();
    }
    Thread.sleep(10);
    }
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    fOut.close();
    socket.close();
    }
    }}import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;/**
     * 该类创建于 2009-6-16 下午03:47:05
     * 
     * @version 1.0.0
     * @author 9sky
     */
    public class Server { private static int Port = 4567;// 服务端监听端口 public static void main(String[] args) throws Exception {
    ServerSocket ss = new ServerSocket(Port, 10);
    Socket s = ss.accept();
    new Server.Sender(s).start();
    } static class Sender extends Thread {
    Socket s;
    boolean running = true;//不停地。
    Sender(Socket s) {
    this.s = s;
    }
    public void run(){
    try{
    while(running){
    OutputStream os = s.getOutputStream();
    String line = "现在时间:"+new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(new java.util.Date())+"\r\n";
    byte b [] = line.getBytes("UTF-8");
    os.write(b);
    System.out.println(line);
    Thread.sleep(10);
    }
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }
    }
      

  14.   

    服务端代码import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class ss {
    public static void main(String[] args) {
    ServerSocket ss;
    Socket s;
    int port=8887;
    try {
    ss=new ServerSocket(port);
    s=ss.accept();
    while(true)
    {
    s.getOutputStream().write("12ab12cd".getBytes());
    }
    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    } }}
    客户端代码import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.Socket;
    public class Sockett implements Runnable
    {
    String   host   =   "127.0.0.1";   
        int   port   =   8887,i;   
        Socket   socket;   
          
        InputStream   is ;   
        FileOutputStream out ;
        byte [] b=new byte[5000];
        byte [] bb=new byte[1];
        byte [] bh=new byte[16];
    byte [] bp=new byte[6];
        Thread th1;
        
        public Sockett()
        {
         th1=new Thread(this);
        }

    public void run()
    {
    try {
    // System.out.println("请输入IP地址");
    // System.in.read(bh);
    // host=new String(bh).trim();
    // //System.out.println("host is"+host);
    // System.out.println("请输入端口号");
    // System.in.read(bp);
    // port=Integer.parseInt(new String(bp).trim());
    //System.out.println("port is"+port);

         socket=new Socket(host,port);
    is=socket.getInputStream();
    out=new FileOutputStream(new File("d:\\\\t2"),true);
    while(true)
    {
    if(is.available()>-1)
    {
    i=is.read(b);
    out.write(b);

    }
    System.in.read(bb);
    char c=(char)bb[0];
    if(c=='0')
    {
    break;
    }
    }
    out.flush();
    is.close();
    out.close();
    socket.close();
    System.out.println("stop");

    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    }

    }}我在服务器端连续向客户端发送数据,为何在客户端无法连续写入文件啊?请高人们指点一下我应如何改啊!
      

  15.   

    System.in.read(bb);
    这句话。程序会停到这句话上面,直到控制台输入一个字符为止。
      

  16.   


    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.Socket;public class Sockett implements Runnable {
    String host = "127.0.0.1"; int port = 23, i; Socket socket; InputStream is; FileOutputStream out; byte[] b = new byte[25 * 1024 ]; byte[] bb = new byte[1]; byte[] bh = new byte[16]; byte[] bp = new byte[6]; Thread th1; public Sockett() {
    th1 = new Thread(this);
    } public void run()
    {
    try {
    System.out.println("数据截取后,将被保存到本地D盘的根目录下,文件名为“比对文件”");
    System.out.println("重新截取数据时,请先把刚建立的用来存放截取数据的文件改名或备份");
    System.out.println("结束程序时,请直接关闭命令行窗口"); // System.out.println("结束程序时请直接关闭命令行窗口");
    System.out.println("请准确输入主机名或主机IP地址");
    System.in.read(bh);
    host=new String(bh).trim();
    // //System.out.println("host is"+host);
    System.out.println("请准确输入端口号");
    System.in.read(bp);
    port=Integer.parseInt(new String(bp).trim());
    // System.out.println("port is"+port);
    System.out.println("重新截取数据时,请先把刚建立的用来存放截取数据的文件改名或备份");
    System.out.println("结束程序时,请直接关闭命令行窗口"); socket=new Socket(host,port);
    is=socket.getInputStream();
    out=new FileOutputStream(new File("d:\\\\比对文件"),true);

    if(is.available()>-1)
    {
    i=is.read(b);
    out.write(b);
                            out.flush();
                            }
    out.close();
    is.close();
    socket.close();

    } catch (IOException e) {

    // TODO 自动生成 catch 块
    e.printStackTrace();
    } }
    }
    我把程序改了下,可为何在客户端还是无法连续写入文件啊?请高人们指点一下我应如何改啊!
      

  17.   

    socket和serverSocket的使用在加上java.io.*的使用就可以
      

  18.   

    貌似楼主的服务端代码中,OutputStream最后没有flush