Java含個(gè)人認(rèn)為很重要的個(gè)人理解和提醒:服務(wù)器,網(wǎng)絡(luò)編程,UDP【詩(shī)書(shū)畫(huà)唱】

網(wǎng)絡(luò)編程概述:
網(wǎng)絡(luò)編程三要素,
UDP編程,
TCP編程。


打印出自己的IP地址

package getIP;
import java.net.*;
public class getIP{
public?
static void main(String[] args) throws Exception{
//
// 下面“DESKTOP-HSPHJ7O”是
// 我自己電腦的IP,這個(gè)只能打印出自己的IP地址
InetAddress ia= InetAddress.getByName("DESKTOP-HSPHJ7O");
System . out. println(ia.getHostAddress());
}
}






?ipconfig: 查看本機(jī)IP地址
netstat -an:查看本機(jī)占用的端口號(hào)



1.使用UDP傳入“我愛(ài)我的祖國(guó)”到服務(wù)器

package getIP;
import java.net.*;
public class UDPFuWuDuan {
//個(gè)人的總結(jié):
//想要寫(xiě)服務(wù)端的話就要先:1.創(chuàng)建接收Socket對(duì)象容器(DatagramSocket)
//2.用DatagramPacket創(chuàng)建一個(gè)數(shù)據(jù)包(接收數(shù)據(jù))
// 3.調(diào)用Socket對(duì)象接收方法(DatagramSocket.receive),接收數(shù)據(jù)
// 4.用byte[]和String(byteArray,0,length)解析數(shù)據(jù)包
// 5.用DatagramSocket.close()釋放資源。
public static void main(String[] args) throws Exception{
System.out.println("服務(wù)器端啟動(dòng)");
// 1.創(chuàng)建接收Socket對(duì)象容器:
// datagram: 數(shù)據(jù)包;?
// socket 英[?s?k?t]
// 美[?sɑ?k?t]
// n. (電源) 插座; (電器上的) 插口,
// 插孔,管座; 托座; 孔穴; 窩; 槽; 臼;
// vt. 把…裝入插座; 給…配插座;
// DatagramSocket(int port)
// 構(gòu)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到本地主機(jī)的指定端口:
DatagramSocket DatagramSocket=
new DatagramSocket(22222);
//:22222為服務(wù)端的端口號(hào)
// 2.創(chuàng)建一個(gè)數(shù)據(jù)包(接收數(shù)據(jù)):
byte[] byteShuZu=new byte[1024*60];
DatagramPacket DatagramPacket=new DatagramPacket
(byteShuZu,0,byteShuZu.length);
// 3.調(diào)用Socket對(duì)象接收方法接收數(shù)據(jù):
System.out.println("服務(wù)器正在耐心的等待接收數(shù)據(jù)");
DatagramSocket.receive(DatagramPacket);//:接收快遞
System.out.println("——————");
System.out.println("服務(wù)器已經(jīng)接收到客戶端發(fā)來(lái)的數(shù)據(jù)了,"
+ "接收到的數(shù)據(jù)的內(nèi)容為:");
// 4.解析數(shù)據(jù)包:
byte[] byteArray=DatagramPacket.getData();
//:得到發(fā)送的字節(jié)數(shù)組。
// 下面是打印客戶端發(fā)來(lái)的數(shù)據(jù):
int length=DatagramPacket.getLength();//:接收長(zhǎng)度
String String=new String(byteArray,0,length);
System.out.println(String);
// 5.釋放資源:
DatagramSocket.close();
}
}


package getIP;
import java.net.*;
public class UDPKeHuDuan {
public static void main(String[] args) throws Exception{
System.out.println("客戶端啟動(dòng)了");
// ——————
// 個(gè)人的總結(jié):
// 客戶端一般是發(fā)送數(shù)據(jù)的,
// 而服務(wù)端一般是接收數(shù)據(jù)的。
// 客戶端和服務(wù)端分別是兩個(gè)Java文件,可以分別寫(xiě)到
// 兩臺(tái)不同的電腦,進(jìn)行互相地聊天,交流,
// 傳輸數(shù)據(jù)。
// 要先開(kāi)啟(執(zhí)行)服務(wù)端,再開(kāi)啟客戶端,這樣才有用。
// 寫(xiě)客戶端時(shí)先要:
// 1.創(chuàng)建發(fā)送數(shù)據(jù)Socket對(duì)象(里面的參數(shù)是你發(fā)送端的端口號(hào)
// ,就是自己設(shè)置聲明的端口號(hào),
// 一般是要大于10000。)
// 2.創(chuàng)建數(shù)據(jù)(一般通過(guò)聲明String或用Scanner接收等的方式
// 來(lái)創(chuàng)建數(shù)據(jù),類(lèi)型不定),用聲明byte[]和getBytes()
// 來(lái)將String等轉(zhuǎn)換為字節(jié),并用DatagramPacket將數(shù)據(jù)打包,
// DatagramPacket
// (byteArray,byteArray.length,
// new InetSocketAddress("127.0.0.1",22222))
// 中的參數(shù)依次為字節(jié)數(shù)組,字節(jié)數(shù)組的長(zhǎng)度,
// 實(shí)例化一個(gè)InetSocketAddress("127.0.0.1",22222)
// 。InetSocketAddress("127.0.0.1",22222)
// 中的參數(shù)分別為127.0.0.1(代表本機(jī))
// ,服務(wù)端(別的要進(jìn)行聯(lián)機(jī)的電腦)的
// 端口號(hào)名(比如這里的22222)。
// ——————
// 多去用一些比喻等來(lái)描述一些過(guò)程,概念等,
// 會(huì)讓聽(tīng)者(包括提出比喻者自己)感到更有趣等。
// ————
// 這個(gè)發(fā)送數(shù)據(jù)的過(guò)程就像是送(退)快遞(貨)的過(guò)程,
// 1.創(chuàng)建發(fā)送數(shù)據(jù)Socket對(duì)象(指定是哪個(gè)快遞員去送快遞)
// 。2.創(chuàng)建數(shù)據(jù),并將數(shù)據(jù)打包(客戶買(mǎi)了的東西,
// 快遞員將要送的東西打包,了解要送的目的地)。
// 3.調(diào)用Socket發(fā)送的方法發(fā)送數(shù)據(jù)(用騎電動(dòng)車(chē)或其他的方法把快遞
// 送到賣(mài)家(服務(wù)端)那里。4.釋放資源(賣(mài)家把錢(qián)退給買(mǎi)家,
// 也就是說(shuō)賣(mài)家把錢(qián)退給客戶)
// ——————
// DatagramSocket(int port):
// 構(gòu)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到本地主機(jī)的指定端口
// ——————
// 發(fā)送數(shù)據(jù):
// 1.創(chuàng)建發(fā)送數(shù)據(jù)Socket對(duì)象(里面的參數(shù)是
// 你發(fā)送端(客戶端)的端口號(hào)):
DatagramSocket DatagramSocket
=new DatagramSocket(11111);//:快遞員
// 2.創(chuàng)建數(shù)據(jù),并將數(shù)據(jù)打包:
String String="我愛(ài)我的祖國(guó)";//:你要發(fā)送的數(shù)據(jù),發(fā)快遞
byte[] byteArray=String.getBytes();//:將數(shù)據(jù)轉(zhuǎn)為字節(jié)
//快遞打包:
DatagramPacket DatagramPacket=new DatagramPacket
(byteArray,byteArray.length,
new InetSocketAddress("127.0.0.1",22222));
// 3.調(diào)用Socket發(fā)送的方法發(fā)送數(shù)據(jù):
DatagramSocket.send(DatagramPacket);//:發(fā)快遞
// 4.釋放資源:
DatagramSocket.close();//:休息
}
}



2.客戶端提示用戶輸入“hello,world”到服務(wù)器端,如果輸入的內(nèi)容不對(duì)
提示,輸入錯(cuò)誤,如果輸入正確提示輸入正確

package getIP;
import java.net.*;
public class HelloWorldFuWuDuan {
//個(gè)人的總結(jié):
//想要寫(xiě)服務(wù)端的話就要先:1.創(chuàng)建接收Socket對(duì)象容器(DatagramSocket)
//2.用DatagramPacket創(chuàng)建一個(gè)數(shù)據(jù)包(接收數(shù)據(jù))
// 3.調(diào)用Socket對(duì)象接收方法(DatagramSocket.receive),接收數(shù)據(jù)
// 4.用byte[]和String(byteArray,0,length)解析數(shù)據(jù)包
// 5.用DatagramSocket.close()釋放資源。
public static void main(String[] args) throws Exception{
System.out.println("服務(wù)器端啟動(dòng)");
// 1.創(chuàng)建接收Socket對(duì)象容器:
// datagram: 數(shù)據(jù)包;?
// socket 英[?s?k?t]
// 美[?sɑ?k?t]
// n. (電源) 插座; (電器上的) 插口,
// 插孔,管座; 托座; 孔穴; 窩; 槽; 臼;
// vt. 把…裝入插座; 給…配插座;
// DatagramSocket(int port)
// 構(gòu)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到本地主機(jī)的指定端口:
DatagramSocket DatagramSocket=
new DatagramSocket(22226);
// ——————
// 個(gè)人提醒:
// //:22226為服務(wù)端的端口號(hào),每一對(duì)服務(wù)端和客戶端的端口號(hào)
// 都不能相同也都不 能太小或太大(比如222226就是
// 太大的“端口號(hào)”),不然就會(huì)報(bào)錯(cuò)。
// ————
// 2.創(chuàng)建一個(gè)數(shù)據(jù)包(接收數(shù)據(jù)):
byte[] byteShuZu=new byte[1024*60];
DatagramPacket DatagramPacket=new DatagramPacket
(byteShuZu,0,byteShuZu.length);
// 3.調(diào)用Socket對(duì)象接收方法接收數(shù)據(jù):
System.out.println("服務(wù)器正在耐心的等待接收數(shù)據(jù)");
DatagramSocket.receive(DatagramPacket);//:接收快遞
System.out.println("——————");
System.out.println("服務(wù)器已經(jīng)接收到客戶端發(fā)來(lái)的數(shù)據(jù)了,"
+ "接收到的數(shù)據(jù)的內(nèi)容為:");
// 4.解析數(shù)據(jù)包:
byte[] byteArray=DatagramPacket.getData();
//:得到發(fā)送的字節(jié)數(shù)組。
// 下面是打印客戶端發(fā)來(lái)的數(shù)據(jù):
int length=DatagramPacket.getLength();//:接收長(zhǎng)度
String String=new String(byteArray,0,length);
System.out.println(String);
if(String.equals("hello,world")){
System.out.println("輸入正確");
}
else {
System.out.println("輸入錯(cuò)誤");
}
// 5.釋放資源:
DatagramSocket.close();
}
}


package getIP;
import java.net.*;
import java.util.Scanner;
public class HelloWorldKeHuDuan {
public static void main(String[] args) throws Exception{
System.out.println("客戶端啟動(dòng)了,"
+ "請(qǐng)接下來(lái)輸入“hello,world”\n"
+ ",這樣的話這個(gè)數(shù)據(jù)就會(huì)發(fā)送到"
+ "服務(wù)端");
// ——————
// 個(gè)人的總結(jié):
// 客戶端一般是發(fā)送數(shù)據(jù)的,
// 而服務(wù)端一般是接收數(shù)據(jù)的。
// 客戶端和服務(wù)端分別是兩個(gè)Java文件,可以分別寫(xiě)到
// 兩臺(tái)不同的電腦,進(jìn)行互相地聊天,交流,
// 傳輸數(shù)據(jù)。
// 要先開(kāi)啟(執(zhí)行)服務(wù)端,再開(kāi)啟客戶端,這樣才有用。
// 寫(xiě)客戶端時(shí)先要:
// 1.創(chuàng)建發(fā)送數(shù)據(jù)Socket對(duì)象(里面的參數(shù)是你發(fā)送端的端口號(hào)
// ,就是自己設(shè)置聲明的端口號(hào),
// 一般是要大于10000。)
// 2.創(chuàng)建數(shù)據(jù)(一般通過(guò)聲明String或用Scanner接收等的方式
// 來(lái)創(chuàng)建數(shù)據(jù),類(lèi)型不定),用聲明byte[]和getBytes()
// 來(lái)將String等轉(zhuǎn)換為字節(jié),并用DatagramPacket將數(shù)據(jù)打包,
// DatagramPacket
// (byteArray,byteArray.length,
// new InetSocketAddress("127.0.0.1",22222))
// 中的參數(shù)依次為字節(jié)數(shù)組,字節(jié)數(shù)組的長(zhǎng)度,
// 實(shí)例化一個(gè)InetSocketAddress("127.0.0.1",22222)
// 。InetSocketAddress("127.0.0.1",22222)
// 中的參數(shù)分別為127.0.0.1(代表本機(jī))
// ,服務(wù)端(別的要進(jìn)行聯(lián)機(jī)的電腦)的
// 端口號(hào)名(比如這里的22222)。
// ——————
// 多去用一些比喻等來(lái)描述一些過(guò)程,概念等,
// 會(huì)讓聽(tīng)者(包括提出比喻者自己)感到更有趣等。
// ————
// 這個(gè)發(fā)送數(shù)據(jù)的過(guò)程就像是送(退)快遞(貨)的過(guò)程,
// 1.創(chuàng)建發(fā)送數(shù)據(jù)Socket對(duì)象(指定是哪個(gè)快遞員去送快遞)
// 。2.創(chuàng)建數(shù)據(jù),并將數(shù)據(jù)打包(客戶買(mǎi)了的東西,
// 快遞員將要送的東西打包,了解要送的目的地)。
// 3.調(diào)用Socket發(fā)送的方法發(fā)送數(shù)據(jù)(用騎電動(dòng)車(chē)或其他的方法把快遞
// 送到賣(mài)家(服務(wù)端)那里。4.釋放資源(賣(mài)家把錢(qián)退給買(mǎi)家,
// 也就是說(shuō)賣(mài)家把錢(qián)退給客戶)
// ——————
// DatagramSocket(int port):
// 構(gòu)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到本地主機(jī)的指定端口
// ——————
// 發(fā)送數(shù)據(jù):
// 1.創(chuàng)建發(fā)送數(shù)據(jù)Socket對(duì)象(里面的參數(shù)是你
// 發(fā)送端(客戶端)的端口號(hào)):
DatagramSocket DatagramSocket
=new DatagramSocket(11116);//:快遞員
// 2.創(chuàng)建數(shù)據(jù),并將數(shù)據(jù)打包:
Scanner s=new Scanner(System.in);
String String=s.next();
// String String="我愛(ài)我的祖國(guó)";
//:你要發(fā)送的數(shù)據(jù),發(fā)快遞
byte[] byteArray=String.getBytes();//:將數(shù)據(jù)轉(zhuǎn)為字節(jié)
//快遞打包:
DatagramPacket DatagramPacket=new DatagramPacket
(byteArray,byteArray.length,
new InetSocketAddress("127.0.0.1",22226));
// 3.調(diào)用Socket發(fā)送的方法發(fā)送數(shù)據(jù):
DatagramSocket.send(DatagramPacket);//:發(fā)快遞
// 4.釋放資源:
DatagramSocket.close();//:休息
}
}




若

會(huì)有中文亂碼等(要鼠標(biāo)右鍵點(diǎn)最后一個(gè)來(lái)統(tǒng)一改成一種編碼格式等,比如UTF-8等)
若

則

3.定義用戶類(lèi),該類(lèi)實(shí)現(xiàn)序列化接口,定義屬性u(píng)name,pwd,
提示用戶輸入用戶名和密碼保存到對(duì)應(yīng)的屬性中,將內(nèi)容使用對(duì)象
傳入到服務(wù)器端,解析傳入的用戶名和密碼,如果用戶名是王大錘密碼
是張三豐就登錄成功,否則登錄失敗

package getIP;
import java.net.*;
public class dengLuFuWuDuan {
public static void main(String[] args) throws Exception{
System.out.println("服務(wù)器端啟動(dòng)");
DatagramSocket DatagramSocket
=new DatagramSocket(23456);
byte[] byteArray=new byte[1026];
DatagramPacket DatagramPacket
=new DatagramPacket(byteArray,byteArray.length);
DatagramSocket.receive(DatagramPacket);
byte[] byteShuZu=DatagramPacket.getData();
int length=DatagramPacket.getLength();
String String= new String(byteShuZu,0,length);
// 之前在客戶端用“:”(String String=uname+":"+pwd;)
// ,在這里和split(用于以split("XXX")中的"XXX"
// 為分割線來(lái)分割字符串)配合用,就有很大的作用了,可以把
// 用戶在客戶端輸入的用戶名和密碼分割,
// 成String數(shù)組中的第一個(gè)內(nèi)容
// (StringArra[0])和第二個(gè)內(nèi)容(StringArra[1])。
String[] StringArray=String.split(":");
if(StringArray[0].trim().equals("王大錘")
&&StringArray[1].trim().equals("張三豐")){
System.out.println("登錄成功");
}else {
System.out.println("登錄失敗");
}
DatagramSocket.close();
}
}


package getIP;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.*;
import java.util.Scanner;
public class dengLuKeHuDuan {
public static void main(String[] args) throws Exception{
//將字符串換為float或者Object
//ByteArrayOutputStream:將內(nèi)容可以轉(zhuǎn)為字節(jié)的流
// ObjectOutputStream:對(duì)象必須序列化,另外對(duì)象也要轉(zhuǎn)為字節(jié)流
System.out.println("客戶端啟動(dòng)了");
System.out.println("提示:如果用戶名是王大錘,"
+ "\n密碼是張三豐就登錄成功,否則登錄失敗");
Scanner s=new Scanner(System.in);
System.out.println("請(qǐng)輸入你的用戶名");
String uname=s.next();
System.out.println("請(qǐng)輸入你的密碼");
String pwd=s.next();
DatagramSocket DatagramSocket
=new DatagramSocket(12345);
String String=uname+":"+pwd;
DatagramPacket DatagramPacket=new
DatagramPacket(String.getBytes(),
String.getBytes().length,
new InetSocketAddress(
// localhost表示本機(jī)
"localhost",23456));
DatagramSocket.send(DatagramPacket);
DatagramSocket.close();
}
}
//Serializable:
//Serializable接口是java提供的通用數(shù)據(jù)保存和讀取的接口。
//功能 :
//實(shí)現(xiàn)java.io.Serializable 。
//
//作用 :
//標(biāo)識(shí)可序列化的語(yǔ)義。
//
//SERIALIZABLE: 序列化可串行化可序列化串行化。
//serializable
//adj. 可串行化的。
class yongHu implements Serializable{
}




若

則

4.使用upd傳入一張圖片到服務(wù)器,服務(wù)器解析圖片到項(xiàng)目的根目錄中

package getIP;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class UdpImgfuWuDuan {
public static void main(String[] args) throws Exception{
System.out.println("服務(wù)器啟動(dòng)了 ");
DatagramSocket DatagramSocket=new DatagramSocket(54321);
//創(chuàng)建接收數(shù)據(jù)的容器:
byte[] byteArray1=new byte[1024*60];
DatagramPacket DatagramPacket=
new DatagramPacket(byteArray1, byteArray1.length);
//堵塞性的接收數(shù)據(jù):
System.out.println("服務(wù)器正在等待用戶發(fā)送圖片");
DatagramSocket.receive(DatagramPacket);
System.out.println("服務(wù)器接收了用戶發(fā)送的圖片");
//解析數(shù)據(jù)包:
byte[] byteArray2=DatagramPacket.getData();
int len1=DatagramPacket.getLength();
//將解析后的字節(jié)數(shù)組再轉(zhuǎn)回圖片:
ByteArrayInputStream ByteArrayInputStream=
new ByteArrayInputStream(byteArray2,0,len1);
FileOutputStream FileOutputStream=
new FileOutputStream("客戶端發(fā)送的3.jpg");
//遍歷byte數(shù)組:
byte [] byteArray3=new byte[1024];
int len2;
while((len2=ByteArrayInputStream.read(byteArray3))!=-1){
FileOutputStream.write(byteArray3,0,len2);
}
FileOutputStream.flush();
FileOutputStream.close();ByteArrayInputStream.close();
DatagramSocket.close();
}
}


package getIP;
import java.util.*;
import java.io.*;
import java.net.*;
public class UdpImgkeHuDuan {
public static void main(String[] args)throws Exception {
// 4.使用upd傳入一張圖片到服務(wù)器,服務(wù)器解析圖片到項(xiàng)目的根目錄中
// disiti();
//創(chuàng)建發(fā)送數(shù)據(jù)的對(duì)象
System.out.println("客戶端啟動(dòng)");
DatagramSocket DatagramSocket=new DatagramSocket(12345);
//得到發(fā)送的數(shù)據(jù)并打包
FileInputStream FileInputStream=new FileInputStream("3.jpg");
ByteArrayOutputStream ByteArrayOutputStream
=new ByteArrayOutputStream();
//在讀圖片的同時(shí)將讀取的內(nèi)容寫(xiě)入到byte字節(jié)流里
byte[] byteArray1=new byte[1024];
int len;
while((len=FileInputStream.read(byteArray1))!=-1){
ByteArrayOutputStream.write(byteArray1,0,len);
}
ByteArrayOutputStream.flush();
byte[] byteArray2=ByteArrayOutputStream.toByteArray();
//將讀取的數(shù)據(jù)轉(zhuǎn)為字節(jié)數(shù)組
DatagramPacket DatagramPacket=new?
DatagramPacket(byteArray2,byteArray2.length,
new InetSocketAddress("localhost",54321));
//發(fā)送數(shù)據(jù)
DatagramSocket.send(DatagramPacket);
DatagramSocket.close();
}
}



鼠標(biāo)右鍵刷新后:

5.在第三題的基礎(chǔ)上判斷用戶名和密碼是否正確,正確則服務(wù)器向客戶端
發(fā)送內(nèi)容,登錄成功,客戶端接收服務(wù)器發(fā)送的內(nèi)容,錯(cuò)誤則發(fā)送登錄失敗
也是由客戶端進(jìn)行接收服務(wù)器發(fā)送的內(nèi)容

package dengLu;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class fuWuDuan {
public static void main(String[] args) throws Exception{
fuWuDuanFangFa();
}
private static void fuWuDuanFangFa() throws?
SocketException, IOException,
ClassNotFoundException {
System.out.println("UDP的服務(wù)器端開(kāi)啟了"
+ "用戶名和密碼都為"
+ "“給詩(shī)書(shū)畫(huà)唱三連關(guān)注”");
DatagramSocket DatagramSocket
=new DatagramSocket(27222);
byte[] byteArray1=new byte[1024];
DatagramPacket DatagramPacket1=new?
DatagramPacket(byteArray1,byteArray1.length);
DatagramSocket.receive(DatagramPacket1);
//:堵塞性的接收內(nèi)容
byte[] byteArray2=DatagramPacket1.getData();
int len2=DatagramPacket1.getLength();
ByteArrayInputStream ByteArrayInputStream2=new?
ByteArrayInputStream(byteArray2,0,len2);
ObjectInputStream ObjectInputStream=new?
ObjectInputStream(ByteArrayInputStream2);
yongHuClass yongHuClass=(yongHuClass)
ObjectInputStream.readObject();
if(yongHuClass.uname.trim().
equals("給詩(shī)書(shū)畫(huà)唱三連關(guān)注")
&&yongHuClass.pwd.trim()
.equals("給詩(shī)書(shū)畫(huà)唱三連關(guān)注")){
String String="登錄成功";
DatagramPacket DatagramPacket=
new DatagramPacket(String.getBytes(),
String.getBytes().length,new?
InetSocketAddress("localhost",17111));
DatagramSocket.send(DatagramPacket);
}else{
String StringFalse="登錄失敗";
DatagramPacket DatagramPacketFalse=new DatagramPacket
(StringFalse.getBytes(),
StringFalse.getBytes().length,
new InetSocketAddress("localhost",17111));
DatagramSocket.send(DatagramPacketFalse);
}
DatagramSocket.close();
}}


package dengLu;
import java.util.*;
import java.io.*;
import java.net.*;
public class keHuDuan {
public static void main(String[] args)throws Exception {
keHuDuanFangFa();
}
private static void keHuDuanFangFa() throws?
SocketException, IOException {
System.out.println("UDP的客戶端開(kāi)啟了");
Scanner s=new Scanner(System.in);
System.out.println("請(qǐng)輸入用戶名");
String uname=s.next();
System.out.println("請(qǐng)輸入用戶密碼");
String pwd=s.next();
yongHuClass yongHuClass=new yongHuClass(uname,pwd);
DatagramSocket DatagramSocket
=new DatagramSocket(17111);
ByteArrayOutputStream ByteArrayOutputStream=
new ByteArrayOutputStream();
ObjectOutputStream ObjectOutputStream=
new ObjectOutputStream(ByteArrayOutputStream);
ObjectOutputStream.writeObject(yongHuClass);
byte[] byteArray1=ByteArrayOutputStream.toByteArray();
DatagramPacket DatagramPacket1
=new DatagramPacket(byteArray1,byteArray1.length
,new InetSocketAddress("localhost",27222));
DatagramSocket.send(DatagramPacket1);
byte[] byteArray2=new byte[1024*60];
DatagramPacket DatagramPacket2=new DatagramPacket
(byteArray2,byteArray2.length);
DatagramSocket.receive(DatagramPacket2);
byte[] byteArray3=DatagramPacket2.getData();
int len3=DatagramPacket2.getLength();
String StringPrintOut=new String(byteArray3,0,len3);
System.out.println(StringPrintOut);
DatagramSocket.close();
}
}
//用戶類(lèi):
class yongHuClass implements Serializable{
String uname,pwd;
public yongHuClass(String uname,String pwd){
this.uname=uname;
this.pwd=pwd;
}
@Override
public String toString() {
return "yonghu [uname=" + uname?
+ ", pwd=" + pwd + "]";
}
}



6.使用多線程實(shí)現(xiàn)1對(duì)1聊天

package dengLu;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class oneVoneFu {
public static void main(String[] args) throws Exception{
System.out.println("詩(shī)書(shū)畫(huà)唱SSHC,服務(wù)器端啟動(dòng),"
+ "\n請(qǐng)先輸入內(nèi)容,將會(huì)發(fā)給客戶端");
jieShouClass jieShouClass=new jieShouClass(33397);
// jieShouClass(int wofangduankou) ,
// 33397是接收客戶端發(fā)送給服務(wù)端時(shí),服務(wù)端要用來(lái)接受
// 客戶端發(fā)來(lái)內(nèi)容的端口號(hào),33397為服務(wù)端專(zhuān)門(mén)用來(lái)接受
// 客戶端發(fā)來(lái)內(nèi)容的端口號(hào)
faSongClass faSongClass=
new faSongClass(44497,11197,"localhost");
//44497為當(dāng)前服務(wù)器發(fā)送給客戶端內(nèi)容時(shí)要用的本機(jī)端口號(hào),
//11197為客戶本機(jī)端口號(hào)
new Thread(jieShouClass,"詩(shī)書(shū)畫(huà)唱").start();
new Thread(faSongClass).start();
}
}


package dengLu;
import java.util.*;
import java.io.*;
import java.net.*;
public class oneVoneKe {
public static void main(String[] args)throws Exception {
System.out.println("詩(shī)書(shū)畫(huà)唱,客戶端啟動(dòng)");
jieShouClass jieShouClass=new jieShouClass(11197);
faSongClass faSongClass
=new faSongClass(22297,33397,"localhost");
// 這里的22297為端口號(hào)
new Thread(jieShouClass,"詩(shī)書(shū)畫(huà)唱SSHC").start();
new Thread(faSongClass).start();
}
}
//————
//將發(fā)送數(shù)據(jù)封為一個(gè)類(lèi),
//將接收數(shù)據(jù)封為一個(gè)類(lèi),
//在用戶不管是客戶端還是服務(wù)器端都開(kāi)啟一個(gè)接收和發(fā)送的線程。
//————
class jieShouClass implements Runnable{
DatagramSocket DatagramSocket=null;
public jieShouClass(int benJiDuanKouHao){
try {
DatagramSocket=new DatagramSocket(benJiDuanKouHao);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
//接收數(shù)據(jù)也是死循環(huán)
while(true){
// byteArrayRead:用來(lái)讀對(duì)方輸入的內(nèi)容的字節(jié)數(shù)組
byte[] byteArrayRead=new byte[1024*60];
DatagramPacket DatagramPacket=
new DatagramPacket
(byteArrayRead, byteArrayRead.length);
try {
DatagramSocket.receive(DatagramPacket);
//解析數(shù)據(jù):
// byteArrayPrint:用來(lái)打印出讀出的對(duì)方發(fā)送過(guò)來(lái)的
// 內(nèi)容的字節(jié)數(shù)組
byte[] byteArrayPrint=DatagramPacket.getData();
int lenPrint=DatagramPacket.getLength();
// jieShouDaoDeNeiRong:接收到對(duì)方發(fā)來(lái)的內(nèi)容
String jieShouDaoDeNeiRong
=new String(byteArrayPrint,0,lenPrint);
if(jieShouDaoDeNeiRong.trim().equals("不聊了")){
break;
}
System.out.println(Thread.currentThread().getName()
+":"+jieShouDaoDeNeiRong);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//:接收數(shù)據(jù)
}DatagramSocket.close();
}
}
class faSongClass implements Runnable{
private int wofangduankou,duiFangDuanKouHao;
String duiFangIP=null;
Scanner s=new Scanner(System.in);
//發(fā)送的對(duì)象:
// benJiDuanKouHao:本機(jī)端口號(hào)
// duiFangDuanKouHao:對(duì)方端口號(hào)
// duiFangIP:對(duì)方IP
DatagramSocket DatagramSocket=null;
public faSongClass(int benJiDuanKouHao,
int duiFangDuanKouHao,String duiFangIP){
this.duiFangDuanKouHao=duiFangDuanKouHao;
this.duiFangIP=duiFangIP;
try {
DatagramSocket=new?
DatagramSocket(benJiDuanKouHao);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
while(true){
//打包數(shù)據(jù):
// shuRuNeiRong;輸入內(nèi)容
System.out.println(
// Thread.currentThread().getName()+
"——————\n"
+ "下面是評(píng)論區(qū)(請(qǐng)輸入你的內(nèi)容)\n"
+ "——————");
//System.out.println(
// Thread.currentThread().getName()+":");
String shuRuNeiRong=s.next();
DatagramPacket DatagramPacket
=new DatagramPacket(shuRuNeiRong.getBytes(),
shuRuNeiRong.getBytes().length,
new InetSocketAddress(duiFangIP,duiFangDuanKouHao));
if(shuRuNeiRong.trim().equals("不聊了")){
break;
}
try {
DatagramSocket.send(DatagramPacket);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
DatagramSocket.close();
}
}





