使用tcp协议写一个可以上传文件的服务器和客户端. 黑马,【TCP】使用TCP协议写一个可以上传文件的服务器和客户端。...

如果上传的文件不知道什么格式,我们需要用字节流来实现,既可以上传文本又可以上传其他格式文件。

上传客户端:

package com.xiaozhi.jingtian.tcp;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.net.Socket;

public class UploadClient {

public static void main(String[] args) throws Exception, IOException {

//创建客户端的Socket服务,指定目的主机和端口号

Socket socket=new Socket("121.251.158.251",10000);

FileInputStream fileInputStream=new FileInputStream("c://1.bmp");

OutputStream outputStream=socket.getOutputStream();

byte[]buffer=new byte[1024];

int lang = 0;

while((lang=fileInputStream.read(buffer))!=-1){

outputStream.write(buffer, 0, lang);

}

fileInputStream.close();

outputStream.close();

socket.close();

}

}

上传服务器(单线程:只能一个客户端实现上传):

package com.xiaozhi.jingtian.tcp;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class UploadServer {

public static void main(String[] args) throws Exception {

//创建服务端的Socket服务,指定端口号

ServerSocket serverSocket=new ServerSocket(10000);

while(true){

//通过accept方法获取连接过来的Socket对象

Socket socket=serverSocket.accept();

FileOutputStream fileOutputStream=new FileOutputStream("c://2.bmp");

InputStream inputStream=socket.getInputStream();

byte[]buffer=new byte[1024];

int lang = 0;

while((lang=inputStream.read(buffer))!=-1){

fileOutputStream.write(buffer, 0, lang);

}

fileOutputStream.close();

inputStream.close();

socket.close();

}

}

}

代码修改

使用多线程修改服务器端代码实现并发上传:

package com.xiaozhi.jingtian.tcp;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

import javax.xml.crypto.Data;

public class UploadServer {

public static void main(String[] args) throws Exception {

//创建服务端的Socket服务,指定端口号

ServerSocket serverSocket=new ServerSocket(10000);

while(true){

//通过accept方法获取连接过来的Socket对象

Socket socket=serverSocket.accept();

new MyThread(socket).start();

}

}

}

class MyThread extends Thread{

private Socket socket;

public MyThread(Socket socket) {

this.socket = socket;

}

@Override

public void run() {

try {

System.out.println(socket.getInetAddress().getHostAddress()+"上传文件");

FileOutputStream fileOutputStream=new FileOutputStream("c://"+System.currentTimeMillis()+".bmp");

InputStream inputStream=socket.getInputStream();

byte[]buffer=new byte[1024];

int lang = 0;

while((lang=inputStream.read(buffer))!=-1){

fileOutputStream.write(buffer, 0, lang);

}

fileOutputStream.close();

inputStream.close();

socket.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}——————————————————————————————————————————————————————————————————————

如果上传的文件是文本文件,可以使用缓冲流来上传,提高效率,下面是上传客户端和上传服务器。需要注意的是,BufferedReader的readLine方法是阻塞式方法,需要判断每一行是否有换行符。(\r\n)

UpLoadClient

package com.xiaozhi.jingtian.tcp;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;

public class UploadClient {

public static void main(String[] args) throws Exception, IOException {

//创建客户端的Socket服务,指定目的主机和端口号

Socket socket=new Socket("121.251.158.251",10000);

BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream("c://1.txt")));

BufferedWriter bufferedWriter= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

String line=null;

while((line=bufferedReader.readLine())!=null){

bufferedWriter.write(line);

bufferedWriter.newLine();

bufferedWriter.flush();

}

bufferedReader.close();

bufferedWriter.close();

socket.close();

}

}

UpLoadServer

package com.xiaozhi.jingtian.tcp;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

import javax.xml.crypto.Data;

public class UploadServer {

public static void main(String[] args) throws Exception {

//创建服务端的Socket服务,指定端口号

ServerSocket serverSocket=new ServerSocket(10000);

while(true){

//通过accept方法获取连接过来的Socket对象

Socket socket=serverSocket.accept();

new MyThread(socket).start();

}

}

}

class MyThread extends Thread{

private Socket socket;

public MyThread(Socket socket) {

this.socket = socket;

}

@Override

public void run() {

try {

System.out.println(socket.getInetAddress().getHostAddress()+"上传文件");

BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));

BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c://"+System.currentTimeMillis()+".txt")));

String line=null;

while((line=bufferedReader.readLine())!=null){

bufferedWriter.write(line);

bufferedWriter.newLine();

bufferedWriter.flush();

}

bufferedReader.close();

bufferedWriter.close();

socket.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

代码修改:

使用PrintWriter替换BufferedWriter,因为println方法自带换行,PrintWriter还可以设置autoFlush的参数,自动刷新。

客户端

package com.xiaozhi.jingtian.tcp;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

public class UploadClient {

public static void main(String[] args) throws Exception, IOException {

//创建客户端的Socket服务,指定目的主机和端口号

Socket socket=new Socket("121.251.158.251",10000);

BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream("c://1.txt")));

PrintWriter printWriter =new PrintWriter(socket.getOutputStream(),true);

String line=null;

while((line=bufferedReader.readLine())!=null){

printWriter.println(line);

}

bufferedReader.close();

printWriter.close();

socket.close();

}

}

服务端

package com.xiaozhi.jingtian.tcp;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import javax.xml.crypto.Data;

public class UploadServer {

public static void main(String[] args) throws Exception {

//创建服务端的Socket服务,指定端口号

ServerSocket serverSocket=new ServerSocket(10000);

while(true){

//通过accept方法获取连接过来的Socket对象

Socket socket=serverSocket.accept();

new MyThread(socket).start();

}

}

}

class MyThread extends Thread{

private Socket socket;

public MyThread(Socket socket) {

this.socket = socket;

}

@Override

public void run() {

try {

System.out.println(socket.getInetAddress().getHostAddress()+"上传文件");

BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));

PrintWriter printWriter =new PrintWriter(new FileOutputStream("c://"+System.currentTimeMillis()+".txt"),true);

String line=null;

while((line=bufferedReader.readLine())!=null){

printWriter.println(line);

}

bufferedReader.close();

printWriter.close();

socket.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值