### 綜合練習 使用 Socket 和多線程編寫一個簡單的聊天小程序,要求客戶端和服務端交替發送消息,在客戶端和服務端都能看到彼此的聊天記錄。 Server ```java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; try { serverSocket = new ServerSocket(8080); System.out.println("服務端已啓動"); while(true) { socket = serverSocket.accept(); new Thread(new SocketThread(socket)).start();; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ``` ServerThread ```java import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class SocketThread implements Runnable { private Socket socket; public SocketThread(Socket socket) { this.socket = socket; } @Override public void run() { // TODO Auto-generated method stub InputStream inputStream = null; DataInputStream dataInputStream = null; Scanner scanner = new Scanner(System.in); String message = null; OutputStream outputStream = null; DataOutputStream dataOutputStream = null; try { while(true) { //讀 inputStream = socket.getInputStream(); dataInputStream = new DataInputStream(inputStream); message = dataInputStream.readUTF(); System.out.println("客戶端:"+message); //寫 System.out.print("服務器:"); message = scanner.next(); outputStream = socket.getOutputStream(); dataOutputStream = new DataOutputStream(outputStream); dataOutputStream.writeUTF(message); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { dataOutputStream.close(); outputStream.close(); dataInputStream.close(); inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } ``` Client ```java import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class Client { public static void main(String[] args) { Socket socket = null; InputStream inputStream = null; DataInputStream dataInputStream = null; OutputStream outputStream = null; DataOutputStream dataOutputStream = null; System.out.println("客戶端已啓動..."); try { socket = new Socket("127.0.0.1", 8080); Scanner scanner = new Scanner(System.in); String message = null; while(true) { //寫 System.out.print("客戶端:"); message = scanner.next(); outputStream = socket.getOutputStream(); dataOutputStream = new DataOutputStream(outputStream); dataOutputStream.writeUTF(message); //讀 inputStream = socket.getInputStream(); dataInputStream = new DataInputStream(inputStream); message = dataInputStream.readUTF(); System.out.println("服務器:"+message); } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { dataInputStream.close(); inputStream.close(); dataOutputStream.close(); outputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } ``` ### XML 解析 XML:Extensible Markup Language 可擴展標記語言 特色: XML 與操做系統無關、與編程語言無關,能夠實現不一樣系統之間的數據交換。 XML 文檔內容由一系列標籤元素組成 <標籤名 屬性名="屬性值">元素內容</標籤名> - 屬性值用雙引號包裹 - 一個元素能夠包含多個屬性 - 屬性值中不能直接包含<、>、"、&、' ```xml <?xml version="1.0" encoding="UTF-8"?> <books> <book id="001"> <author>張三</author> <name>Java高級編程</name> <description>Java是一門面向對象高級編程語言</description> </book> <book id="002" author="李四" name="C#" description="面向對象"></book> </books> ``` 注意事項 - 全部 XML 元素都必須有結束標籤 - XML 標籤對大小寫敏感 - XML 必須有正確的嵌套 - 同級標籤以縮進對齊 - 元素名稱能夠包含字母、數字或其餘字符 - 元素名稱不能以數字或標點符號開頭 - 元素名稱不能包含空格 XML 的轉義字符 特殊字符:< > " ' & 轉義符: ``` < > " ' & ``` 衣服型號 對應身高 S <165 M 165-170 L 170-175 XL 175-180 XXL 180-185 ```xml <?xml version="1.0" encoding="UTF-8"?> <cloth> <size range="height>165">S</size> <size range="165<height<170">M</size> <size range="170<height<175">L</size> <size range="175<height<180">XL</size> <size range="180<height<185">XXL</size> </cloth> ``` 考生姓名 預計得分 實際得分 張三 75 80 李四 75 88 ```xml <?xml version="1.0" encoding="UTF-8"?> <students> <student name="張三" expected_score="75" score="80"></student> <student name="李四" expected_score="75" score="88"></student> </students> ``` ### 解析XML 用 Java 程序讀取、操做 XML 文件中的數據 dom4j 主流的 Java XML API,性能優異,功能強大。 ```xml <?xml version="1.0" encoding="GBK"?> <phoneinfo id="1"> <brand name="華爲"> <type name="U8650"></type> <type name="HW123"></type> <type name="HW321"></type> </brand> <brand name="蘋果"> <type name="iPhone"></type> </brand> <brand name="三星"> <type name="Note4"></type> </brand> </phoneinfo> ``` ```java import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Test { public static void main(String[] args) { SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read("src/phone.xml"); //獲取根節點 Element root = document.getRootElement(); Iterator<Element> rootIter = root.elementIterator(); while(rootIter.hasNext()) { Element ele = rootIter.next(); String name = ele.attributeValue("name"); System.out.println(name); Iterator<Element> eleIter = ele.elementIterator(); while(eleIter.hasNext()) { Element type = eleIter.next(); String typeName = type.attributeValue("name"); System.out.println(typeName); } } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ``` ```java import java.io.FileWriter; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Test2 { public static void main(String[] args) { SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read("src/phone.xml"); Element root = document.getRootElement(); Element newEle = root.addElement("brand"); newEle.addAttribute("name", "Vivo"); Element type = newEle.addElement("type"); type.addAttribute("name", "型號1"); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); Writer fileWriter = new FileWriter("src/phone.xml"); XMLWriter writer = new XMLWriter(fileWriter,format); writer.write(document); writer.close(); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ```
Client.javajava
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class Client { public static void main(String[] args) { Socket socket = null; InputStream inputStream = null; DataInputStream dataInputStream = null; OutputStream outputStream = null; DataOutputStream dataOutputStream = null; System.out.println("客戶端已啓動..."); try { socket = new Socket("127.0.0.1", 8080); Scanner scanner = new Scanner(System.in); String message = null; while(true) { //寫 System.out.print("客戶端:"); message = scanner.next(); outputStream = socket.getOutputStream(); dataOutputStream = new DataOutputStream(outputStream); dataOutputStream.writeUTF(message); //讀 inputStream = socket.getInputStream(); dataInputStream = new DataInputStream(inputStream); message = dataInputStream.readUTF(); System.out.println("服務器:"+message); } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { dataInputStream.close(); inputStream.close(); dataOutputStream.close(); outputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
cloth.xml編程
<?xml version="1.0" encoding="UTF-8"?> <cloth> <size range="height>165">S</size> <size range="165<height<170">M</size> <size range="170<height<175">L</size> <size range="175<height<180">XL</size> <size range="180<height<185">XXL</size> </cloth>
phone.xml小程序
<?xml version="1.0" encoding="UTF-8"?> <phoneinfo id="1"> <brand name="華爲"> <type name="U8650"/> <type name="HW123"/> <type name="HW321"/> </brand> <brand name="蘋果"> <type name="iPhone"/> </brand> <brand name="三星"> <type name="Note4"/> </brand> <brand name="Vivo"/> <brand name="Vivo"> <type name="型號1"/> </brand> </phoneinfo>
score.xml服務器
<?xml version="1.0" encoding="UTF-8"?> <students> <student name="張三" expected_score="75" score="80"></student> <student name="李四" expected_score="75" score="88"></student> </students>
Server.java多線程
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; try { serverSocket = new ServerSocket(8080); System.out.println("服務端已啓動"); while(true) { socket = serverSocket.accept(); new Thread(new SocketThread(socket)).start();; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
SocketThread.javadom
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class SocketThread implements Runnable { private Socket socket; public SocketThread(Socket socket) { this.socket = socket; } @Override public void run() { // TODO Auto-generated method stub InputStream inputStream = null; DataInputStream dataInputStream = null; Scanner scanner = new Scanner(System.in); String message = null; OutputStream outputStream = null; DataOutputStream dataOutputStream = null; try { while(true) { //讀 inputStream = socket.getInputStream(); dataInputStream = new DataInputStream(inputStream); message = dataInputStream.readUTF(); System.out.println("客戶端:"+message); //寫 System.out.print("服務器:"); message = scanner.next(); outputStream = socket.getOutputStream(); dataOutputStream = new DataOutputStream(outputStream); dataOutputStream.writeUTF(message); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { dataOutputStream.close(); outputStream.close(); dataInputStream.close(); inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
Test.javasocket
import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Test { public static void main(String[] args) { SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read("src/phone.xml"); //獲取根節點 Element root = document.getRootElement(); Iterator<Element> rootIter = root.elementIterator(); while(rootIter.hasNext()) { Element ele = rootIter.next(); String name = ele.attributeValue("name"); System.out.println(name); Iterator<Element> eleIter = ele.elementIterator(); while(eleIter.hasNext()) { Element type = eleIter.next(); String typeName = type.attributeValue("name"); System.out.println(typeName); } } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
test.xml編程語言
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="001"> <author>張三</author> <name>Java高級編程</name> <description>Java是一門面向對象高級編程語言</description> </book> <book id="002" author="李四" name="C#" description="面向對象"></book> </books>
Test2.javaide
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Test2 {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read("src/phone.xml");
Element root = document.getRootElement();
Element newEle = root.addElement("brand");
newEle.addAttribute("name", "Vivo");
Element type = newEle.addElement("type");
type.addAttribute("name", "型號1");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
Writer fileWriter = new FileWriter("src/phone.xml");
XMLWriter writer = new XMLWriter(fileWriter,format);
writer.write(document);
writer.close();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}