黑马程序员技术交流社区
标题:
tcp文件传输问题
[打印本页]
作者:
工善器
时间:
2014-1-5 21:00
标题:
tcp文件传输问题
package first;
import java.net.*;
import java.io.*;
/*如何定义线程呢?只要了明白了每个客户端要在服务端执行的代码即可
* 将改代码存入run方法中。
* */
class ClientTcp {
public static void main(String[] args) throws Exception {
Socket s = new Socket("192.168.1.254", 80001);
FileInputStream fis = new FileInputStream("C:\\1.txt");
OutputStream out = s.getOutputStream();
byte[] buf = new byte[1024 * 64];
int len = 0;
while ((len = fis.read(buf)) != -1) {
out.write(buf, 0, len);
}
// 告诉服务端数据已经写完
s.shutdownOutput();
InputStream in = s.getInputStream();
byte[] bufin = new byte[1024 * 64];
int num = in.read(bufin);
System.out.println(new String(bufin, 0, num));
fis.close();
s.close();
}
}
/*服务端:
这个服务端有一个局限性,当a客户端连接上之后,被服务端获取到,服务端执行具体流程,
这是b客户端连接,只有等待。
因为服务端还没有处理完A客户端的请求,还要循环回来执行下次accept方法。所以
暂时获取不到b客户端对象,
那么为了可以让多个客户端同时并发访问服务端。
那么服务端最好就是让每一个客户端封装到一个单独 的线程中去,这样可以同时处理多个客户端请求。
*/
class ServerTcp {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(80001);
// 这里写while(true),服务端不会一直转,accept她是阻塞式方法。
while (true) {
// 拿到客户端对象
Socket s = ss.accept();
// 读取s中的数据
InputStream in = s.getInputStream();
FileOutputStream fos = new FileOutputStream("server.bmp");
byte[] buf = new byte[1024 * 64];
int len = 0;
while ((len = in.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 搞一个输出流,反馈给客户信息,显示上传成功
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
// ss.close();
}
}
}
复制代码
怎么在一个.java里执行两个main方法,顺便看下程序?
作者:
快乐的黑马
时间:
2014-1-5 21:15
这么长,这么好的代码,当然可以放在同一个.java中运行啦,你可以命名为DemoTcp.java它保存在大硬盘中,编译只写DemoTcp.java,但执行时,要单独写类的名称,如果你用的是DOS命令行的话要开两个。
亲,你的端口写错了吧?哪有这么大的端口。优化代码可以用多线程。
作者:
工善器
时间:
2014-1-5 21:41
快乐的黑马 发表于 2014-1-5 21:15
这么长,这么好的代码,当然可以放在同一个.java中运行啦,你可以命名为DemoTcp.java它保存在大硬盘中,编 ...
好尖的眼,建议版主给你加一分,恩,端口太大,已经报错了,不过似乎还有其他方面的问题
不过用eclipse,开两个窗口,是有错的,,,??
作者:
范二青年
时间:
2014-1-5 22:35
可以一起执行的
你可以这样来做 你这不是写了两个类么 随便把哪个定义成public的 然后把整个文件定义成和你public类同名文件
然后你执行就能看见会让你选你要执行哪个类的main方法
import java.net.*;
import java.io.*;
/*如何定义线程呢?只要了明白了每个客户端要在服务端执行的代码即可
* 将改代码存入run方法中。
* */
public class ClientTcp {
public static void main(String[] args) throws Exception {
Socket s = new Socket("192.168.1.105", 8001);
FileInputStream fis = new FileInputStream("C:\\1.txt");
OutputStream out = s.getOutputStream();
byte[] buf = new byte[1024 * 64];
int len = 0;
while ((len = fis.read(buf)) != -1) {
out.write(buf, 0, len);
}
// 告诉服务端数据已经写完
s.shutdownOutput();
InputStream in = s.getInputStream();
byte[] bufin = new byte[1024 * 64];
int num = in.read(bufin);
System.out.println(new String(bufin, 0, num));
fis.close();
s.close();
}
}
/*服务端:
这个服务端有一个局限性,当a客户端连接上之后,被服务端获取到,服务端执行具体流程,
这是b客户端连接,只有等待。
因为服务端还没有处理完A客户端的请求,还要循环回来执行下次accept方法。所以
暂时获取不到b客户端对象,
那么为了可以让多个客户端同时并发访问服务端。
那么服务端最好就是让每一个客户端封装到一个单独 的线程中去,这样可以同时处理多个客户端请求。
*/
class ServerTcp {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8001);
// 这里写while(true),服务端不会一直转,accept她是阻塞式方法。
while (true) {
// 拿到客户端对象
Socket s = ss.accept();
// 读取s中的数据
InputStream in = s.getInputStream();
FileOutputStream fos = new FileOutputStream("server.bmp");
byte[] buf = new byte[1024 * 64];
int len = 0;
while ((len = in.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 搞一个输出流,反馈给客户信息,显示上传成功
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
// ss.close();
}
}
}
复制代码
我已经执行成功了哦,试试吧 有问题再问我哈 求技术分
作者:
快乐的黑马
时间:
2014-1-6 12:22
哈哈,我还没十个技术分,够呛来找你们啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2