您的位置:首页 > 理论基础 > 计算机网络

TCP传输数据。上传文件

2017-09-20 16:18 85 查看
TCP:通过三次握手,建立一个连接通道

1.客户端getoutputstream进行write

2.服务端getinputstream进行read

3.服务器端getoutputstream进行write

4.客户端getinputstream进行read

传输结束之后,通道要关闭。

最初版本客户端public class ClientTCP {

public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1", 8888);
OutputStream os = s.getOutputStream();
os.write("TCP走你".getBytes());
s.close();
}

}
服务器端
public class ServerTCP {

public static void main(String[] args) throws Exception {
// 创建socket对象并监听指定端口
ServerSocket ss = new ServerSocket(8888);
// 获取客户端连接对象
Socket s = ss.accept();
// 通过连接对象获取输入流,读取数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
// 将客户端传输的数据转换成字符串
String result = new String(buf, 0, len);
String ip = s.getInetAddress().getHostAddress();
System.out.println("ip=" + ip + ",result=" + result);
// 关闭资源
ss.close();
}

}


有来回的TCP聊天室

客户端public class ClientTCP2 {

public static void main(String[] args) throws Exception {
// 建立客户端的Socket并指定地址和端口号
Socket s = new Socket("127.0.0.1", 8888);
// 向服务器端写出数据
OutputStream out = s.getOutputStream();
// 将字节输出流转换为缓冲字符输出流
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("借点钱啊");
bw.newLine();
// 刷新缓冲区,将缓冲区中的数据刷新到服务器端
bw.flush();
// 接受服务器端给的反馈信息
InputStream is = s.getInputStream();
// 将字节读取流转换成缓冲字符读取流
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String result = br.readLine();
System.out.println(result);
s.close();
}

}
服务器端
public class ServerTCP2 {

public static void main(String[] args) throws Exception {
// 建立服务端Socket并监听指定接口
ServerSocket ss = new ServerSocket(8888);
// 通过端口接受连接对象
Socket s = ss.accept();
// 连接对象获取客户端传输过来的数据
InputStream in = s.getInputStream();
// 将字节读取流转换成缓冲字符读取流
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
String result = br.readLine();
System.out.println(result);
// 将结果反馈给客户端
OutputStream out = s.getOutputStream();
// 将字节输出流转换成缓冲字符输出流
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("不在,没钱");
// bw.newLine();
bw.flush();
s.close();
ss.close();
}

}
持续性传输数据
客户端public class Client2 {

public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bw = new BufferedWriter(osw);
Scanner sc = new Scanner(System.in);
String content;
while (!(content=sc.nextLine()).equals("886")) {
bw.write(content);
bw.newLine();
bw.flush();
}
sc.close();
socket.close();
}

}
服务端
public class Server2 {

public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8888);
while (true) {
Socket s = ss.accept();
// 因为可能是多个客户端,所以不能一直只为一个客户端处理数据,当连接拿到之后,将任务交给子线程进行处理
new Thread(new DealSocket(s)).start();
}
}

}

class DealSocket implements Runnable {
private Socket s;

public DealSocket(Socket s) {
super();
this.s = s;
}

@Override
public void run() {
try {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String result;
while ((result = br.readLine()) != null) {
System.out.println(result);
}
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
将图片上传
客户端public static void main(String[] args) throws Exception {
// 创建客户端套接字并指定地址和端口号
Socket s = new Socket("127.0.0.1", 8888);
// 获取输出流
// 将字节输出流包装成缓冲字节输出流
BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
// 将图片写出到服务端
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("/Users/yoofale/Desktop/9527.jpg"));
// 自定义缓冲区
byte[] buf = new byte[1024];
int len;
while ((len = bis.read(buf)) != -1) {
bos.write(buf, 0, len);
bos.flush();
}
// 关闭流
bis.close();
// 告诉服务端上传完毕
s.shutdownInput();
// 获取上传的结果
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(br.readLine());
// 关闭资源
s.close();
}服务端
public class UploadServer {

public static void main(String[] args) throws Exception {
Socket s = null;
// 获取客户端链接对象
try {
ServerSocket ss = new ServerSocket(8888);
while (true) {
s = ss.accept();
// 获取客户端发送过来的字节数据
BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
// 封装图片保存的位置
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("/Users/yoofale/Desktop/" + System.currentTimeMillis()));
// 循环读写
byte[] buf = new byte[1024];
int len;
while ((len = bis.read(buf)) != -1) {
bos.write(buf, 0, len);
bos.flush();
}
System.out.println("上传成功");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw.write("上传成功");
bw.newLine();
bw.flush();
}
} catch (Exception e) {
// 此时,上传失败
System.out.println("上传失败");
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw.write("上传失败");
bw.newLine();
bw.flush();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (null != s) {
try {
s.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: