----------android培训、java培训、期待与您的交流-----------
总结:发生数据之前需要先有个目的(UDP),或者先建立平台(TCP)
UDP:面向无连接,所以先启动服务端还是客户端无所谓
--------------------------UDP发送端----------------------------------------
// 创建UDP服务
DatagramSocket ds = new DatagramSocket(8000);
while (true) {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
byte[] data = br.readLine().getBytes();
//打包数据(包含目的地)
DatagramPacket p = new DatagramPacket(data, data.length,
InetAddress.getByName("27.151.71.184"), 10000);
ds.send(p);//发送
--------------------------UDP接收端----------------------------------------
//接收端:// 创建UDP服务
DatagramSocket socket = new DatagramSocket(10000);
while (true) {
byte[] buf = new byte[1024];
//创建存储的包裹
DatagramPacket packet = new DatagramPacket(buf, buf.length);
// 等待接受数据
socket.receive(packet);
// 已接受到数据
String ip = packet.getAddress().getHostAddress();
String data = new String(packet.getData(), 0, packet.getLength());
int port = packet.getPort();
System.out.println(ip + " " + data + " " + port);
}
注意:DatagramPacket构造中有含地址为发送时的包裹
TCP:需要先启动服务端
--------------------------TCP服务端----------------------------------------
ServerSocket server = new ServerSocket(10000);
System.out.println("等待客户端连接...");
Socket client = server.accept();
PrintStream ps = new PrintStream(client.getOutputStream(),true);
while (true) {
BufferedReader br = new BufferedReader(new InputStreamReader(
client.getInputStream()));
String ip=client.getInetAddress().getHostAddress();
System.out.println("等待"+ip+"传输数据...");
String originData = br.readLine();//readLine这个方法已/r/n结束,所以传入的数据必须包含
if("over".equals(originData))
break;
String newData = originData.toUpperCase();
ps.println(newData);
}
client.close();
server.close();
--------------------------TCP客户端----------------------------------------
Socket client = new Socket(InetAddress.getByName("110.84.200.94"),
10000);
BufferedReader input = new BufferedReader(new InputStreamReader(
client.getInputStream()));
PrintStream ps = new PrintStream(client.getOutputStream(),true);
BufferedReader output = new BufferedReader(new InputStreamReader(
System.in));
while (true) {
System.out.println("等待输入...");
ps.println(output.readLine());
String res = input.readLine();
if (res != null) {
System.out.println(res);
continue;
}
break;
}
client.close();
--------------------------TCP文件上传服务端----------------------------------------
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(10000);
while (true) {
System.out.println("等待客户端连接...");
Socket client = server.accept();
new Thread(new Service(client)).start();
Thread.sleep(200);//为了控制台显示方便
}
}
private static final class Service implements Runnable {
private Socket client;
private String ip;
public Service(Socket client) {
this.client = client;
}
@Override
public void run() {
try {
//以ip为文件名
ip = client.getInetAddress().getHostAddress();
System.out.println(ip+":正在上传文件");
InputStream fis = client.getInputStream();
File file = new File("D:\\TCP", ip+".jpg");
file.getParentFile().mkdir();
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
PrintStream ps = new PrintStream(client.getOutputStream());
int len = 0;
byte[] buf = new byte[1024];
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
fos.flush();
}
ps.println("文件上传完毕");
fos.close();
} catch (Exception e) {
throw new RuntimeException(ip + ":上传文件失败:"+e.getMessage());
}
}
}
}
--------------------------TCP文件上传客户端端----------------------------------------
public class Client {
public static void main(String[] args) throws Exception {
Socket client = new Socket(InetAddress.getByName("110.84.200.94"),
10000);
FileInputStream fis = new FileInputStream(new File("C:\\1.jpg"));
OutputStream os = client.getOutputStream();
int len = 0;
byte[] buf = new byte[1024];
while ((len = fis.read(buf)) != -1) {
os.write(buf, 0, len);
os.flush();
}
client.shutdownOutput();// 标记输出流操作完毕,不然服务端还会一直读,报 Connection reset异常
String res = new BufferedReader(new InputStreamReader(
client.getInputStream())).readLine();
System.out.println(res);
client.close();
}
}
注意:
client.shutdownOutput();// 标记输出流操作完毕,不然服务端还会一直读,报 Connection reset异常