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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 工善器 高级黑马   /  2014-1-5 21:00  /  1086 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package first;

  2. import java.net.*;
  3. import java.io.*;
  4. /*如何定义线程呢?只要了明白了每个客户端要在服务端执行的代码即可
  5. * 将改代码存入run方法中。
  6. * */
  7. class ClientTcp {

  8.         public static void main(String[] args) throws Exception {
  9.                 Socket s = new Socket("192.168.1.254", 80001);
  10.                 FileInputStream fis = new FileInputStream("C:\\1.txt");
  11.                 OutputStream out = s.getOutputStream();
  12.                 byte[] buf = new byte[1024 * 64];
  13.                 int len = 0;
  14.                 while ((len = fis.read(buf)) != -1) {
  15.                         out.write(buf, 0, len);
  16.                 }
  17.                 // 告诉服务端数据已经写完
  18.                 s.shutdownOutput();

  19.                 InputStream in = s.getInputStream();
  20.                 byte[] bufin = new byte[1024 * 64];
  21.                 int num = in.read(bufin);
  22.                 System.out.println(new String(bufin, 0, num));
  23.                 fis.close();
  24.                 s.close();
  25.         }
  26. }
  27. /*服务端:
  28. 这个服务端有一个局限性,当a客户端连接上之后,被服务端获取到,服务端执行具体流程,
  29. 这是b客户端连接,只有等待。
  30. 因为服务端还没有处理完A客户端的请求,还要循环回来执行下次accept方法。所以
  31. 暂时获取不到b客户端对象,
  32. 那么为了可以让多个客户端同时并发访问服务端。
  33. 那么服务端最好就是让每一个客户端封装到一个单独 的线程中去,这样可以同时处理多个客户端请求。
  34. */
  35. class ServerTcp {
  36.         public static void main(String[] args) throws Exception {
  37.                 ServerSocket ss = new ServerSocket(80001);
  38.                 // 这里写while(true),服务端不会一直转,accept她是阻塞式方法。
  39.                 while (true) {
  40.                         // 拿到客户端对象
  41.                         Socket s = ss.accept();
  42.                         // 读取s中的数据
  43.                         InputStream in = s.getInputStream();
  44.                         FileOutputStream fos = new FileOutputStream("server.bmp");
  45.                         byte[] buf = new byte[1024 * 64];
  46.                         int len = 0;
  47.                         while ((len = in.read(buf)) != -1) {
  48.                                 fos.write(buf, 0, len);
  49.                         }
  50.                         // 搞一个输出流,反馈给客户信息,显示上传成功
  51.                         OutputStream out = s.getOutputStream();
  52.                         out.write("上传成功".getBytes());
  53.                         fos.close();
  54.                         s.close();
  55.                         // ss.close();
  56.                 }

  57.         }
  58. }
复制代码
怎么在一个.java里执行两个main方法,顺便看下程序?

4 个回复

倒序浏览
这么长,这么好的代码,当然可以放在同一个.java中运行啦,你可以命名为DemoTcp.java它保存在大硬盘中,编译只写DemoTcp.java,但执行时,要单独写类的名称,如果你用的是DOS命令行的话要开两个。
亲,你的端口写错了吧?哪有这么大的端口。优化代码可以用多线程。
回复 使用道具 举报
快乐的黑马 发表于 2014-1-5 21:15
这么长,这么好的代码,当然可以放在同一个.java中运行啦,你可以命名为DemoTcp.java它保存在大硬盘中,编 ...

好尖的眼,建议版主给你加一分,恩,端口太大,已经报错了,不过似乎还有其他方面的问题
不过用eclipse,开两个窗口,是有错的,,,??
回复 使用道具 举报
可以一起执行的
你可以这样来做  你这不是写了两个类么   随便把哪个定义成public的  然后把整个文件定义成和你public类同名文件
然后你执行就能看见会让你选你要执行哪个类的main方法
  1. import java.net.*;
  2. import java.io.*;
  3. /*如何定义线程呢?只要了明白了每个客户端要在服务端执行的代码即可
  4. * 将改代码存入run方法中。
  5. * */
  6. public class ClientTcp {

  7.         public static void main(String[] args) throws Exception {
  8.                 Socket s = new Socket("192.168.1.105", 8001);
  9.                 FileInputStream fis = new FileInputStream("C:\\1.txt");
  10.                 OutputStream out = s.getOutputStream();
  11.                 byte[] buf = new byte[1024 * 64];
  12.                 int len = 0;
  13.                 while ((len = fis.read(buf)) != -1) {
  14.                         out.write(buf, 0, len);
  15.                 }
  16.                 // 告诉服务端数据已经写完
  17.                 s.shutdownOutput();

  18.                 InputStream in = s.getInputStream();
  19.                 byte[] bufin = new byte[1024 * 64];
  20.                 int num = in.read(bufin);
  21.                 System.out.println(new String(bufin, 0, num));
  22.                 fis.close();
  23.                 s.close();
  24.         }
  25. }
  26. /*服务端:
  27. 这个服务端有一个局限性,当a客户端连接上之后,被服务端获取到,服务端执行具体流程,
  28. 这是b客户端连接,只有等待。
  29. 因为服务端还没有处理完A客户端的请求,还要循环回来执行下次accept方法。所以
  30. 暂时获取不到b客户端对象,
  31. 那么为了可以让多个客户端同时并发访问服务端。
  32. 那么服务端最好就是让每一个客户端封装到一个单独 的线程中去,这样可以同时处理多个客户端请求。
  33. */
  34. class ServerTcp {
  35.         public static void main(String[] args) throws Exception {
  36.                 ServerSocket ss = new ServerSocket(8001);
  37.                 // 这里写while(true),服务端不会一直转,accept她是阻塞式方法。
  38.                 while (true) {
  39.                         // 拿到客户端对象
  40.                         Socket s = ss.accept();
  41.                         // 读取s中的数据
  42.                         InputStream in = s.getInputStream();
  43.                         FileOutputStream fos = new FileOutputStream("server.bmp");
  44.                         byte[] buf = new byte[1024 * 64];
  45.                         int len = 0;
  46.                         while ((len = in.read(buf)) != -1) {
  47.                                 fos.write(buf, 0, len);
  48.                         }
  49.                         // 搞一个输出流,反馈给客户信息,显示上传成功
  50.                         OutputStream out = s.getOutputStream();
  51.                         out.write("上传成功".getBytes());
  52.                         fos.close();
  53.                         s.close();
  54.                         // ss.close();
  55.                 }

  56.         }
  57. }
复制代码


我已经执行成功了哦,试试吧  有问题再问我哈   求技术分
回复 使用道具 举报
哈哈,我还没十个技术分,够呛来找你们啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马