TCP网络编程
TCP需要服务端与客户端建立连接,建立连接后才能发送数据。
服务端需要提供本机ip和指定端口号。
客户端连接服务端需要指定服务端的IP和端口号。
1、对于服务器,要创建服务器的套接字,服务器的IP为本机ip,不用指定,但要指定端口号,接着开始侦听客户端连接。
//1.创建
int port = 16666;
ServerSocket listener = new ServerSocket(port);
//2.侦听
Socket socket = listener.accept();
2、对于客户端,要创建连接套接字,指定连接的主机ip和端口号。
//1.创建连接服务器的套接字
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 16666;
Socket socket = new Socket(serverIP,port);
接着从套接字中获取输入输出流,
输入流 用于 从套接字中取东西,输出流 用于 往套接字里放东西。
另外,往socket里传大量数据(如文件)时,传输完毕后需要通知socket,“我传完了。”
socket.shutdownOutput(); 否则另一端不能开始从socket中读取字节。
客户端-服务器 聊天系统
client
package com.net.transstring;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
//1.创建连接服务器的套接字
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 16666;
Socket socket = new Socket(serverIP,port);
//2.获取输入流输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
Scanner scanner = new Scanner(System.in);
boolean flag = true;
System.out.println("欢迎跟小育聊天!输入-1退出聊天!");
while(flag == true) {
String msg = scanner.nextLine();
if(msg.equals("-1")){
flag = false;
}
//3.1处理数据(发送)
bw.write(msg);
bw.newLine(); //换行
bw.flush(); //刷新缓存
//3.2处理数据(接收)
String str = br.readLine();
System.out.println("小育回复:"+str);
}
//4.关闭资源
scanner.close();
bw.close();
socket.close();
}
}
server
package com.net.transstring;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
//1.创建
int port = 16666;
ServerSocket listener = new ServerSocket(port);
System.out.println("小育上线啦!");
//2.侦听
Socket socket = listener.accept();
//3.获取输入输出流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));
String[] responses ={"小育什么也不知道哦","真的吗!","太好啦!",
"那你可以带小育一起去玩嘛?","谢谢你!","好耶!"};
boolean flag = true;
while(flag == true){
//4.1处理数据(接收)
String data = br.readLine();
String response;
if(data.equals("-1")){
response = "那再见咯!";
flag = false;
} else {
response = responses[data.hashCode()%6];
}
System.out.println("客户端说:"+data);
//4.2处理数据(发送)
bw.write(response);
bw.newLine();
bw.flush();
}
//5.关闭资源
bw.close();
br.close();
socket.close();
listener.close();
}
}
客户端-服务端 文件传输系统
client
package com.net.transfile;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
//1.创建连接服务器的套接字
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 16666;
Socket socket = new Socket(serverIP, port);
//2.获取输入流输出流
OutputStream os = socket.getOutputStream();
// Scanner scanner = new Scanner(System.in);
// String msg = scanner.nextLine();
String msg = "C:\\Users\\86186\\Desktop\\飞机.png";
System.out.println("欢迎使用文件传输!");
//3、读取文件
FileInputStream fis = new FileInputStream(new File(msg));
//4、写入文件
byte[] buffer = new byte[1024];
//注意读和写之间要有缓存。不能把输入流直接对接输出流
int len;
while ((len = fis.read(buffer)) != -1) { //输入流存到缓存
os.write(buffer, 0, len); // 缓存放到输出流
}
//5.通知服务器我传完了(必要!!!!!)
//因为这是那个在传的管道,对面不能用。所以有必要通知停止传了再使用
//仅对于这种将文件数据传入socket管道的情况
socket.shutdownOutput();
//6、接收客户端响应,转换成字符串,用字节数组流
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = is.read(buffer2)) != -1) {
baos.write(buffer2, 0, len2);
}
System.out.println("得到输入");
//字节数组流可以把字节直接转换成字符串而不乱码
System.out.println("服务端回复:" + baos.toString());
//6.关闭资源
// scanner.close();
is.close();
os.close();
socket.close();
}
}
server
package com.net.transfile;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws Exception {
//1.创建欢迎连接套接字
int port = 16666;
ServerSocket listener = new ServerSocket(port);
System.out.println("欢迎使用文件传输系统!");
//2、监听
Socket socket = listener.accept();
//1、获取输入流
InputStream is = socket.getInputStream();
int len;
byte[] buffer = new byte[1024]; //因为不能输入流直接对接输出流,所以中间有缓存
String fileName = "receive.jpg";
//2、把字节流写入文件
FileOutputStream fos = new FileOutputStream(new File(fileName));
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
//3、通知客户端接收到了
OutputStream os = socket.getOutputStream();
os.write("已收到".getBytes());
is.close();
os.close();
socket.close();
listener.close();
}
}
720

被折叠的 条评论
为什么被折叠?



