网络通信#
- ip 电脑地址
- UDP TCP
- 端口号
- socket 插座, 数据流间的插座, 用来联通
- 类似电脑是港口ip, socket是航线用来发货, 端口号是港口停放船的泊位, UDP TCP是小船还是大船来运送数据箱子
DatagramSocket 与 DatagramPacket#
- DatagramSocket 创建一条航线
- DatagramPacket 指定电脑ip(港口), 端口号(泊位), 运送的数据(集装箱)
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class Demo1_Send {
public static void main(String[] args) throws IOException {
String msg = "中午一起吃饭";
DatagramSocket datagramSocket = new DatagramSocket();
DatagramPacket datagramPacket = new DatagramPacket
(msg.getBytes(StandardCharsets.UTF_8),msg.getBytes().length, InetAddress.getByName("127.0.0.1"),2000);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Demo2_Receive {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(2000);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
socket.receive(packet);
byte[] arr = packet.getData();
int len = packet.getLength();
System.out.println(new String(arr,0,len));
socket.close();
}
}
能够不断录入的版本#
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Demo3_Send {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
DatagramSocket datagramSocket = new DatagramSocket();
while (true){
String msgLine = sc.nextLine();
if( "quit".equals(msgLine)){
break;
}
System.out.println(msgLine);
DatagramPacket packet =
new DatagramPacket (msgLine.getBytes(StandardCharsets.UTF_8),
msgLine.getBytes().length,
InetAddress.getByName("127.0.0.1"),
2000);
datagramSocket.send(packet);
}
datagramSocket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Demo3_Receive {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(2000);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
while (true){
socket.receive(packet);
byte[] arr = packet.getData();
int len = packet.getLength();
System.out.println("信息" + new String(arr,0,len));
}
}
}
多线程发送和接收信息#
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Demo4_MoreThread {
public static void main(String[] args) {
MyReceive myReceive = new MyReceive();
MySend mySend = new MySend();
myReceive.start();
mySend.start();
}
}
class MyReceive extends Thread{
@Override
public void run() {
try {
DatagramSocket socket = null;
socket = new DatagramSocket(2000);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
while (true){
socket.receive(packet);
byte[] arr = packet.getData();
int len = packet.getLength();
System.out.println("信息" + new String(arr,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class MySend extends Thread{
@Override
public void run() {
Scanner sc = new Scanner(System.in);
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket();
while (true){
String msgLine = sc.nextLine();
if( "quit".equals(msgLine)){
break;
}
DatagramPacket packet =
new DatagramPacket (msgLine.getBytes(StandardCharsets.UTF_8),
msgLine.getBytes().length,
InetAddress.getByName("127.0.0.1"),
2000);
datagramSocket.send(packet);
}
} catch (IOException e) {
e.printStackTrace();
}
datagramSocket.close();
}
}
GUI 聊天#
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo5_GUIChat extends Frame{
private TextField textField;
private TextArea viewText;
private TextArea sendText;
private Button send;
private Button log;
private Button clear;
private Button shake;
private DatagramSocket socket;
// private BufferedReader br;
private FileInputStream fis;
private BufferedWriter bw;
public Demo5_GUIChat() throws SocketException,IOException{
init();
southPanel();
centerPanel();
event();
Receive r = new Receive();
r.start();
this.setVisible(true);
}
public void event() {
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
try {
bw.close();
} catch (IOException ex) {
ex.printStackTrace();
}
socket.close();
System.exit(0);
}
});
send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
send();
} catch (SocketException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
log.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
logFile();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
viewText.setText("");
}
});
shake.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// shake();
try {
send(new byte[]{-1},textField.getText());
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
sendText.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER ){
try {
send();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
}
public void shake(){
int x = this.getX();
int y = this.getY();
for(int i=0;i<20;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i % 2 == 0){
this.setLocation(x+3,y+3);
} else {
this.setLocation(x,y);
}
}
}
public void logFile() throws IOException {
// br = new BufferedReader(new InputStreamReader(new FileInputStream("chat.log")));
// br = new BufferedReader(new FileReader("chat.log"));
// viewText.setText("");
// int len ;
// char [] arr = new char[1024];
// while ( ( len =br.read(arr)) != -1){
// viewText.append(new String(arr,0,len));
// }
// br.close();
fis = new FileInputStream("chat.log");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len;
byte[] arr = new byte[8192];
while ( (len = fis.read(arr)) != -1){
bos.write(arr,0,len);
}
viewText.setText(bos.toString());
bos.close();
}
public void send(byte[] arr,String ip) throws IOException {
DatagramPacket packet = new DatagramPacket(arr,
arr.length,
InetAddress.getByName(ip),
9999);
socket.send(packet);
}
public void send() throws IOException {
String msg = sendText.getText();
if( "".equals(msg.trim()) || null ==msg){
return;
} else {
String ip = textField.getText();
if( ip.equals(null) || ip.trim().equals("")){
ip = "255.255.255.255";
}
String time = getTime();
send(msg.getBytes(StandardCharsets.UTF_8),ip);
String chatlog = time+" "+"我对:"+(ip.equals("255.255.255.255")? "所有人":ip)+"说:"+"\n"+ msg +"\n"+"\n";
viewText.append(chatlog);
bw.write(chatlog);
bw.flush();
sendText.setText("");
}
}
public String getTime(){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
return sdf.format(date);
}
public void centerPanel() {
Panel center = new Panel();
viewText = new TextArea();
sendText = new TextArea(5,2);
viewText.setEditable(false);
viewText.setBackground(Color.WHITE);
center.setLayout( new BorderLayout());
center.add(sendText, BorderLayout.SOUTH);
center.add(viewText, BorderLayout.CENTER);
sendText.setFont(new Font("xxx", Font.PLAIN,20));
viewText.setFont(new Font("xxx", Font.PLAIN,16));
this.add(center, BorderLayout.CENTER);
}
public void southPanel() {
Panel south = new Panel();
textField = new TextField(15);
textField.setText("127.0.0.1");
send = new Button("发送");
log = new Button("记录");
clear = new Button("清除");
shake = new Button("振动");
south.add(textField);
south.add(send);
south.add(log);
south.add(clear);
south.add(shake);
this.add(south, BorderLayout.SOUTH);
}
private void init() throws IOException {
this.setLocation(500,10);
this.setSize(500,800);
socket = new DatagramSocket();
// bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("chat.log",true)));
bw = new BufferedWriter(new FileWriter("chat.log",true));
}
public static void main(String[] args) throws SocketException,IOException {
Demo5_GUIChat guiChat = new Demo5_GUIChat();
}
private class Receive extends Thread{
//发送 接收同时进行
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket(9999);
DatagramPacket packet = new DatagramPacket(new byte[8192], 8192);
while (true){
socket.receive(packet);
byte[] arr = packet.getData();
int length = packet.getLength();
if( length == 1 && arr[0] == -1){
shake();
continue;
}
String msg = new String(packet.getData(), 0, packet.getLength());
String chatlog = getTime()+" "+textField.getText()+" "+"对我说:"+"\n"+msg+"\n\n" ;
viewText.append(chatlog);
bw.write(chatlog);
bw.flush();
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
TCP协议 (重要)#
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Demo2_Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(2000);
Socket socket = server.accept();
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
os.write("明天还上班不".getBytes(StandardCharsets.UTF_8));
byte[] arr = new byte[8192];
int len;
len = is.read(arr);
System.out.println(new String(arr,0,len));
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Demo1_Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.01",2000);
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
byte[] arr = new byte[8192];
int len = is.read(arr);
os.write("吃了".getBytes(StandardCharsets.UTF_8));
System.out.println(new String(arr,0,len));
}
}
服务端 客户端TCP 优化#
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Demo2_Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(2000);
Socket socket = server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
OutputStream out;
PrintStream ps = new PrintStream(socket.getOutputStream()) ;
ps.println("快乐, 放假了");
System.out.println(br.readLine());
ps.println("出来玩吧");
System.out.println(br.readLine());
}
}
import java.io.*;
import java.net.Socket;
public class Demo2_Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.01",2000);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream()) ;
System.out.println( br.readLine());
ps.println("是的, 放假了");
System.out.println( br.readLine());
ps.println("起飞");
}
}
服务增加多线程#
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo2_Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(2000);
while (true){
final Socket socket = server.accept();
new Thread(){
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
OutputStream out;
PrintStream ps = new PrintStream(socket.getOutputStream()) ;
ps.println("快乐, 放假了");
System.out.println(br.readLine());
ps.println("出来玩吧");
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
}
服务端反转字符并写给客户端#
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo3_Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(2000);
while (true){
final Socket socket = server.accept();
new Thread(){
@Override
public void run() {
while (true){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream()) ;
StringBuilder sb = new StringBuilder( br.readLine());
ps.println(sb.reverse());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Demo3_Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.01",2000);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream()) ;
Scanner sc = new Scanner(System.in);
String s = null;
while (true){
s = sc.nextLine();
ps.println(s);
System.out.println( br.readLine());
}
}
}
上传文件到服务端#
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo4_Server_SaveFiles {
public static void main(String[] args) throws IOException{
ServerSocket server = new ServerSocket(2000);
while (true){
final Socket socket = server.accept();
new Thread(){
@Override
public void run() {
while (true){
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(socket.getOutputStream()) ;
File dir = new File("update");
if(!dir.exists()){
dir.mkdir();
}
String fileName = br.readLine();
System.out.println(fileName);
File file = new File(dir, fileName);
if( file.exists()){
ps.println("已存在");
return;
}else {
ps.println("不存在");
}
byte[] arr = new byte[8192];
int len;
FileOutputStream fos = new FileOutputStream(file);
while ( ( len = is.read(arr)) != -1){
fos.write(arr,0,len);
}
fos.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
}
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Demo4_Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.01",2000);
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(socket.getOutputStream()) ;
Scanner sc = new Scanner(System.in);
String s = null;
int len;
byte[] arr = new byte[8192];
while (true){
s = sc.nextLine();
File file = new File(s);
if( !file.exists()){
System.out.println("文件不存在");
} else if( file.isDirectory()){
System.out.println("文件夹, 请重新输入文件");
} else if (file.isFile()){
ps.println(s);
String flag = br.readLine();
if( "已存在".equals(flag)){
System.out.println(flag);
return;
} else {
InputStream inputStream = new FileInputStream(file);
while ( (len = inputStream.read(arr)) != -1){
ps.write(arr,0,len);
}
ps.flush();
}
}
}
}
}