本帖最后由 胡浩 于 2013-6-2 15:55 编辑
下面的代码实现一个多个客户端往同一个服务端上传图片的功能,我的疑问是,服务端在使用serverSocket提供服务的时候必须要明确端口号,比如serverSocket ss=new serverSocket(10006);
然后在通过accept获取Socket对象。和指定的客户端进行交互,问题是每个客户端的端口号可能不一样,那么serverSocket ss=new serverSocket(10006)这样指定端口后不是只能为一个客户端服务了吗?
是吗,如何解决这个问题?
这里使用多线程封装了处理客户端请求的任务。- package cn.itcast.net.p1.uploadpic;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- public class UploadTask implements Runnable {
- private static final int SIZE = 1024*1024*2;
- private Socket s;
- public UploadTask(Socket s) {
- this.s = s;
- }
- @Override
- public void run() {
- int count = 0;
- String ip = s.getInetAddress().getHostAddress();
- System.out.println( ip + ".....connected");
-
- try{
- // 读取客户端发来的数据。
- InputStream in = s.getInputStream();
- // 将读取到数据存储到一个文件中。
- File dir = new File("c:\\pic");
- if (!dir.exists()) {
- dir.mkdirs();
- }
- File file = new File(dir, ip + ".jpg");
- //如果文件已经存在于服务端
- while(file.exists()){
- file = new File(dir,ip+"("+(++count)+").jpg");
- }
-
-
- FileOutputStream fos = new FileOutputStream(file);
- byte[] buf = new byte[1024];
- int len = 0;
- while ((len = in.read(buf)) != -1) {
-
-
-
- fos.write(buf, 0, len);
-
- if(file.length()>SIZE){
- System.out.println(ip+"文件体积过大");
-
- fos.close();
- s.close();
-
-
- System.out.println(ip+"...."+file.delete());
-
- return ;
- }
- }
- // 获取socket输出流,将上传成功字样发给客户端。
- OutputStream out = s.getOutputStream();
- out.write("上传成功".getBytes());
- fos.close();
- s.close();
- }catch(IOException e){
-
- }
- }
- }
复制代码 这里是服务端。- package cn.itcast.net.p1.uploadpic;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class UploadPicServer {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
-
- //创建tcp的socket服务端。
- ServerSocket ss = new ServerSocket(10006);
-
- while(true){
- Socket s = ss.accept();
-
- new Thread(new UploadTask(s)).start();
-
- }
- //获取客户端。
-
-
- // ss.close();
-
-
- }
- }
复制代码 这里是客户端- package cn.itcast.net.p1.uploadpic;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- import java.net.UnknownHostException;
- public class UploadPicClient {
- /**
- * @param args
- * @throws IOException
- * @throws UnknownHostException
- */
- public static void main(String[] args) throws UnknownHostException, IOException {
-
- //1,创建客户端socket。
- Socket s = new Socket("192.168.1.100",10006);
-
- //2,读取客户端要上传的图片文件。
- FileInputStream fis = new FileInputStream("c:\\0.bmp");
-
- //3,获取socket输出流,将读到图片数据发送给服务端。
- OutputStream out = s.getOutputStream();
-
- byte[] buf = new byte[1024];
-
- 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];
-
- int lenIn = in.read(buf);
- String text = new String(buf,0,lenIn);
- System.out.println(text);
-
- fis.close();
- s.close();
-
-
-
-
- }
- }
复制代码 代码贴的有点多,请原谅!!!
|