您的位置:程序门 -> java -> j2se / 基础类



怎么将客户端和服务器端写到一个程序中


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


怎么将客户端和服务器端写到一个程序中
发表于:2007-03-15 18:43:58 楼主
我写一个传送和接收文件的程序,想点对点的不用另外加服务器,所以就直接把客户端和服务器端写在同一个程序中,但是有个问题,就是服务器端在执行.accept();这个方法的时候,会一直阻塞,直到有收到客户端请求为止(一旦阻塞就无法去执行发送文件那个进程),
所以我想必须把他们放到单独的线程中,但是服务器这个线程怎么写啊!..........困惑中
发表于:2007-03-15 18:57:551楼 得分:0
import   java.net.*;
import   java.io.*;
public   class   server
{
private   serversocket   server;
private   socket   you;
private   receive   rec;
public   server()
{
try
{
server   =   new   serversocket(2007);
    system.out.println( "服务器运行中,监听端口:2007...... ");
while(true)
{
you   =   server.accept();
if(you   !=   null)
{
system.out.println( "有客户连接启动接收线程... ");
new   thread(new   receive(you)).start();
system.out.println( "接收文件内容如下:   ---> 服务器继续监听中... ");
}
}
}catch(exception   e){system.out.println( "服务端运行出错! ");}
}

public   static   void   main(string   args[])
{
new   server();
}
}

class   receive   implements   runnable
{
private   file   files;
private   datainputstream   din   =   null;
private   dataoutputstream   dout   =   null;
private   socket   mysock   =   null;
private   int   str   =   1;
public   receive(socket   you)
{
this.mysock   =   you;
//files   =   new   file( "d:\\data.txt ");
}

public   void   run()
{
try
{
din   =   new   datainputstream(mysock.getinputstream());
dout   =   new   dataoutputstream(mysock.getoutputstream());

while(true)
{
if((str=din.readint())   ==   0)
break;
system.out.println( " "   +   din.readutf());
}
}catch(exception   e){system.out.println( "接收出错! ");}
finally
{
clears();
}

}

void   clears()
{
try
{
dout.close();
din.close();
mysock.close();
}catch(exception   e){system.out.println( "关闭出错 ");}
    }

}
发表于:2007-03-15 18:58:512楼 得分:0
这个是接收到的数据直接显示出来了,你改改就行,大概思路就这样,
发表于:2007-03-15 19:25:573楼 得分:0
但这个程序不能发送文件啊,我要既能收文件   又能发文件
就是还有个相当于下面这个类
  class   sendfile
{
      fileinputstream   fis;//读取文件变量
      dataoutputstream   dos;//网线路中写信息变量
      datainputstream   dis;
      string   dir;
      string   file;
      string   targetip;
      sendfile(string   f,string   dir,string   ip)
      {
              file   =f;
              this.dir=dir;
              targetip   =ip;
      }
    public   void   send()
    {


            byte       bytebuffer[]=       new       byte[16000];
            int       temp;
            socket   socket;

            try
              {
                  fis=new   fileinputstream(dir+file);//打开文件

              }catch(ioexception   e){}

            try
            {
                //建立连接
                socket   =   new   socket(targetip,4311);
                dos   =new   dataoutputstream(socket.getoutputstream());
                dis   =   new   datainputstream(socket.getinputstream());
                //先向服务器端发一消息表示准备开始传文件
                  dos.writeutf( "ready? "+file);
                  //当收到对方应答后就开始传送文件
                  if(dis.readutf().compareto( "ready ")==0)
                //开始读文件传送
                {
                        while   ((temp=   fis.read(bytebuffer))   !=   -1)
                        {
                                dos.write(bytebuffer);
                        }

                        fis.close();
                        dos.close();
                    }
            }catch(ioexception   e1){}

      }

}
但是如果在一个程序中的话,你看那个accept()服务器端运行到这时,就只有再那等,只能收文件   不能发啊,分开肯定可以   服务端程序和客户端   和起就不晓得怎么弄了
发表于:2007-03-15 20:03:514楼 得分:0
我客户端没发,你直接集成进去就行了,,最主要的搞明白,接收在哪个端口,发送到哪个端口就行了
发表于:2007-03-15 20:10:355楼 得分:0
import   java.net.*;
import   java.io.*;
public   class   client
{
private   socket   you;
senddata   sends;

public   client()
{
try
{      
    you   =   new   socket( "localhost ",2007);
system.out.println( "连接服务器监听端口:2007...... ");
if(you   !=   null)
{
system.out.println( "连接成功,启动发送线程... ");
new   thread(new   senddata(you)).start();
system.out.println( "发送完毕!关闭线程... ");
}
}catch(exception   e){system.out.println( "服务端运行出错! ");}
}

public   static   void   main(string   args[])
{
new   client();
}
}

class   senddata   implements   runnable
{
private   file   files;
private   bufferedreader   bin   =   null;
private   datainputstream   din   =   null;
private   dataoutputstream   dout   =   null;
private   socket   mysock   =   null;
private   string   data   =   " ";
public   senddata(socket   you)
{
this.mysock   =   you;
files   =   new   file( "d:\\data.txt ");
}

public   void   run()
{
try
{
bin   =   new   bufferedreader(new   inputstreamreader(new   fileinputstream(files)));
din   =   new   datainputstream(mysock.getinputstream());
dout   =   new   dataoutputstream(mysock.getoutputstream());
while((data   =   bin.readline())   !=   null)
{
dout.writeint(1);
dout.writeutf(data);
}
dout.writeint(0);
clears();
}catch(exception   e){}
finally
{
clears();
}

}

void   clears()
{
try
{
bin.close();
dout.close();
din.close();
mysock.close();
}catch(exception   e){system.out.println( "关闭出错 ");}
    }

}


客户端,你直接放在 server类的后面编译就行了,只是我的文件路径是固定的,你写个方法动态获取试试,
发表于:2007-03-15 20:49:126楼 得分:0
刚试了一下,没成功,不好意思,你自己重写一个算了,
主程序监听一个端口,
分别建两个线程类,一个用于接收,一个用于发送,


快速检索

最新资讯
热门点击