A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜鹏云 中级黑马   /  2012-8-17 19:47  /  2197 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜鹏云 于 2012-8-18 10:30 编辑

需求:使用TCP协议写一个可以上传文件的服务器和客户端
现有两个文件:
第一个 :TcpClient.java
import java.io.*;
import java.net.*;
class  TcpClient
{
        public static void main(String[] args) throws Exception
        {
                /*开启客户端tcp服务*/
           Socket s=new Socket("127.0.0.1",10003);
           /*读取上传文件*/
           BufferedReader br=new BufferedReader(new FileReader("adusa.java"));
           /*将上传文件写入网络流*/
           PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
           String line=null;
           while((line=br.readLine())!=null)
                {
                   pw.println(line);
                }
                s.shutdownOutput();//返回传输结束标记
       /*读取服务器端的反馈信息*/
                BufferedReader bfrd=new BufferedReader(new InputStreamReader(s.getInputStream()));
                String str=bfrd.readLine();
                System.out.println(str);
                br.close();
                s.close();
        }
}
第二个文件:TcpServer.java
import java.io.*;
import java.net.*;
class  TcpServer
{
        public static void main(String[] args) throws Exception
        {   
                /*开启服务器端tcp服务*/

                ServerSocket ss=new ServerSocket(10003);
                 /*获取客户端连接*/
                Socket s=ss.accept();
        /*读取客户端的数据*/
        BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
                /*将客户端的数据写入服务器端*/
            PrintWriter pw=new PrintWriter(new FileWriter("upload.txt"),true);
                String line=null;
                while((line=br.readLine())!=null)
                {
                        pw.println(line);
                }
       PrintWriter bw=new PrintWriter(s.getOutputStream(),true);
           bw.println("上传成功");
           pw.close();
           s.close();

        }
}
问题:原先通过开启两个命令行窗口分别模拟客户端和服务器端,来实现文件的上传服务。
      现在要求通过eclipse创建一个java文件,用多线程来实现上传文件的服务器和客户端的功能。不知道哪位高手指点一下,如何来做??

评分

参与人数 1黑马币 +15 收起 理由
田建 + 15 写两个类,分别运行,先运行服务端;.

查看全部评分

12 个回复

正序浏览
张莹莹 发表于 2012-8-18 11:01
import java.io.*;
import java.net.*;
class  TcpClient

妹子。。两个命令行的程序,好做!但是我的想法只开启一个命令行,其中可以同时来运行客户端和服务器端。你的解决方案里面有两个main()
回复 使用道具 举报
刘圣伟 发表于 2012-8-18 11:14
这个是可以的,把tcp 客户端和服务端,都封装成一个方法,开2个线程,一个运行服务器,一个运行客户端。
注 ...

这个想法不错。。。我来试试一试
回复 使用道具 举报
这个是可以的,把tcp 客户端和服务端,都封装成一个方法,开2个线程,一个运行服务器,一个运行客户端。
注意要先运行服务器端, 然后,sleep 几秒,客户端再运行,就OK了


有些病毒就是这样在机器上面来进行复制文件的。
回复 使用道具 举报
楼主你说的线程的问你 ,客户端 是一个独立的程序,服务端也是一个独立的程序 ,  客户端的有自己的线程啊 服务端也有自己的线程,这个网络这面涉及的 貌似是关于IO流的问题比较多吧。 您说的是一个线程从客服端开始  在到服务端?  这个想法很有点太宏观了吧? 因为这个里面 还要有IO流的问题存在啊,还是 客户端本身有自己的线程啊?若是客户端自身的 线程 自己内部操作就可以了啊。。。

还有就是 服务端和客户端 能否写一个文档里的问题, 这个我还真没见过哦,我看的都是 服务端代码 是一个class文件   客户端是一个class文件啊。。。只有 服务端开启了 ,,您客户端才可以往服务端传送数据哦。。。

现在的开发结构基于网络的有两种:

1.c/s结构
       
        client/server 客户端和服务端
        特点:
        1,客户端和服务端的软件或者是应用程序,都需要程序员进行编写。
        2,客户端维护起来较为麻烦。
        3,好处:客户端的存在可以将一部分运算分离到客户端来运行,减轻了服务器端的压力。

这种 就好比我们经常完的网页游戏一样。
       

2.b/s结构
        Asp  jsp  php
        browser/server  浏览器和服务端。
        1,客户端不用程序员编写,直接使用系统中具备的浏览器软件座位客户端即可、
           程序员需要编写服务器端就哦了。
        2,维护起来也很容易,因为只要维护服务器即可。
        3,所有的运算都在服务器端,相对压力较大。

这个相当于有客户端 和服务端的  游戏 也打个例子  大话西游2 不知道楼主玩过没?
回复 使用道具 举报
import java.io.*;
import java.net.*;
class  TcpClient
{
        public static void main(String[] args) throws Exception
        {
                //创建客户端的socket服务。指定目的主机和端口
                Socket s = new Socket("127.0.0.1",10003);
               
                //为了发送数据,应该获取socket流中的输出流。
                OutputStream out = s.getOutputStream();

                out.write("hello,TCP ".getBytes());


                s.close();
        }
}
class  TcpServer
{
        public static void main(String[] args) throws Exception
        {
                //建立服务端socket服务。并监听一个端口。
                ServerSocket ss = new ServerSocket(10003);

                //通过accept方法获取连接过来的客户端对象。
                while(true)
                {
                Socket s = ss.accept();

                String ip = s.getInetAddress().getHostAddress();
                System.out.println(ip+".....connected");

                //获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
                InputStream in = s.getInputStream();
               
                byte[] buf = new byte[1024];
                int len = in.read(buf);

                System.out.println(new String(buf,0,len));

                s.close();//关闭客户端.
                }
                //ss.close();
        }
}
该文件名可以命名为TcpDemo.java,打开两个窗口
运行的时候首先为 javac TcpDemo.java
java TcpServer  在另一个窗口 java TcpClient

演示.png (46.39 KB, 下载次数: 74)

运行结果

运行结果
回复 使用道具 举报
杜鹏云 发表于 2012-8-18 10:47
就是建立两个线程 分别模拟客户端和服务器端。而且你说的那种方法行在只用一个main()方法能解决么? ...

我贴个代码,你看看吧
回复 使用道具 举报
张莹莹 发表于 2012-8-18 10:33
你多线程的意思是系统自身的多线程还是你自己编写多线程?

就是建立两个线程 分别模拟客户端和服务器端。而且你说的那种方法行在只用一个main()方法能解决么?
回复 使用道具 举报
杜鹏云 发表于 2012-8-18 10:30
那用多线程怎么来实现这个过程

你多线程的意思是系统自身的多线程还是你自己编写多线程?
回复 使用道具 举报
张莹莹 发表于 2012-8-18 09:55
建立.java文件命名为TcpDemo.java,在文件中建立两个类分别为TcpClient和TcpServer,首先编译TcpDemo.java ...

那用多线程怎么来实现这个过程
回复 使用道具 举报
建立.java文件命名为TcpDemo.java,在文件中建立两个类分别为TcpClient和TcpServer,首先编译TcpDemo.java,然后分别运行 java TcpServer和java TcpClient
回复 使用道具 举报
曹恒业 发表于 2012-8-17 20:22
上传和下载2个类分开写2个java文件,分别调用各自功能执行对应main方法。

我想用一个java文件写 该怎么实现
回复 使用道具 举报
上传和下载2个类分开写2个java文件,分别调用各自功能执行对应main方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马