Java傳輸當(dāng)前日期,TCP網(wǎng)絡(luò)編程,Socket,UDP傳輸,DatagramPacket【詩(shī)書畫唱】
用上TCP,先啟動(dòng)服務(wù)器的部分,之后開啟客戶端,之后用客戶端發(fā)送信息給服務(wù)器

package TCP;
import java.io.*;
import java.net.*;
public class TCP服務(wù)器 {
public static void main(String[] args) throws Exception{
System.out.println("用TCP啟動(dòng)了服務(wù)器");
ServerSocket ServerSocket=new ServerSocket(8888);
while(true){
Socket Socket=ServerSocket.accept();
ObjectInputStream ObjectInputStream=
new ObjectInputStream(Socket.getInputStream());
byte[] b=new byte[1024*60];?
ObjectInputStream.read(b);
if(new String(b,0,b.length).equals("break")){
Socket.close();
break;
}else{
System.out.println("給詩(shī)書畫唱三連關(guān)注");
System.out.println("接收到的客戶端發(fā)送來(lái)"
+ "的內(nèi)容為"+new String(b,0,b.length));
}
}
ServerSocket.close();
}
}


package TCP;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class TCP客戶端 {
public static void main(String[] args) throws Exception{
System.out.println("啟動(dòng)了客戶端");
// 什么是Socket 在計(jì)算機(jī)通信領(lǐng)域,socket 被翻譯為“套接字”,
// 它是計(jì)算機(jī)之間進(jìn)行通信的一種約定或一種方式
Socket s=new Socket("localhost",8888);
Scanner s1=new Scanner(System.in);
while(true){
System.out.println("請(qǐng)輸入內(nèi)容");
String str=s1.next();
if(str.trim().equals("break")){
break;
}else{
ObjectOutputStream oos
=new ObjectOutputStream(s.getOutputStream());
oos.write(str.getBytes());
oos.flush();
System.out.println(2);
}
}
s.close();
}
}



用UDP協(xié)議來(lái)用客戶端把當(dāng)前的日期傳給服務(wù)端

——————

package date;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.net.*;
import java.util.Date;
public class UDPfuWuDuan {
public static void main(String[] args) throws Exception{
System.out.println("服務(wù)器端啟動(dòng)成功!先啟動(dòng)服務(wù)端之后啟動(dòng)"
+ "客戶端,"
+ "\n之后客戶端會(huì)把當(dāng)前的日期發(fā)送到服務(wù)端");
// datagram:
// 數(shù)據(jù)報(bào); 數(shù)據(jù)包; 數(shù)據(jù)報(bào)文; 數(shù)據(jù)報(bào); 數(shù)據(jù)表;
DatagramSocket DatagramSocket
=new DatagramSocket(23456);
byte[] byteArray1=new byte[1026];
DatagramPacket DatagramPacket=new DatagramPacket(byteArray1,
byteArray1.length);
DatagramSocket.receive(DatagramPacket);
byte[] byteArray=DatagramPacket.getData();
int len=DatagramPacket.getLength();
//用readObject(),讀傳入過(guò)來(lái)的數(shù)據(jù)。
//ByteArrayInputStream:可以得到字節(jié),但是不能轉(zhuǎn)int。
//ObjectInputStream:可以轉(zhuǎn)int。
ByteArrayInputStream ByteArrayInputStream
=new ByteArrayInputStream(byteArray,0,len);
//
// ObjectInputStream為對(duì)象輸入流,
// 把ByteArrayInputStream放到對(duì)象輸入流的“()”里,
// 就可以把內(nèi)容轉(zhuǎn)為int類型的數(shù)據(jù)。
ObjectInputStream ObjectInputStream
=new ObjectInputStream(ByteArrayInputStream);
Date Date =(Date)ObjectInputStream.readObject();
System.out.println(Date.toLocaleString());
DatagramSocket.close();
}
}


package date;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.*;
import java.util.Date;
import java.util.Scanner;
public class UDPkeHuDuanDate {
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)了");
DatagramSocket DatagramSocket=new DatagramSocket(12345);
Date Date=new Date();
//int類型不能直接轉(zhuǎn)字節(jié)數(shù)組
//ByteArrayOutputStream:轉(zhuǎn)字節(jié)(不能讀int)
//ObjectOutputStream:這個(gè)可以讀int
ByteArrayOutputStream ByteArrayOutputStream
=new ByteArrayOutputStream();
ObjectOutputStream ObjectOutputStream
=new ObjectOutputStream(ByteArrayOutputStream);
ObjectOutputStream.writeObject(Date);
ObjectOutputStream.flush();
//
byte[] byteArray2=ByteArrayOutputStream.toByteArray();
DatagramPacket DatagramPacket2=new DatagramPacket(byteArray2,
byteArray2.length,new InetSocketAddress(
"localhost",23456));
DatagramSocket.send(DatagramPacket2);
DatagramSocket.close();
}
}
////傳float和自定義一個(gè)用戶名和密碼試一下
//class yonghu implements Serializable{
//
//}


package TCP;
import java.net.*;
import java.io.*;
import java.util.*;
public class TCP_fuWuQi {
//現(xiàn)在是每個(gè)人的Socket保存在對(duì)應(yīng)的線程里
//聲明一個(gè)集合用來(lái)保存每個(gè)線程,打印的時(shí)候就是遍歷保存
//線程的集合,
static Vector<fuwuqi_jieshou> v_xiancheng=new Vector<fuwuqi_jieshou>();
public static void main(String[] args) throws Exception{
System.out.println("服務(wù)器啟動(dòng)了");
//1.定義服務(wù)器對(duì)象
ServerSocket ss=new ServerSocket(12345);
//2.使用服務(wù)器對(duì)象進(jìn)行堵塞性接收數(shù)據(jù)
System.out.println("服務(wù)器等待用戶傳輸數(shù)據(jù)");
while(true){
Socket s=ss.accept();
System.out.println("一個(gè)用戶建立了鏈接");
fuwuqi_jieshou fj= new fuwuqi_jieshou(s);
//將每個(gè)人的線程保存在線程集合里
v_xiancheng.add(fj);
new Thread(fj).start();
}
// 每一個(gè)客戶端訪問(wèn)服務(wù)器他們使用的是自己的額Socket,
// 現(xiàn)在造成的原因是多個(gè)人去訪問(wèn)的時(shí)候,他們用的是同一個(gè)Socket
// 就會(huì)造成堵塞,當(dāng)前Socket沒(méi)有被釋放掉,其他Socket進(jìn)不來(lái),就會(huì)
// 造成只有一個(gè)人可以說(shuō)話
//
// 如何解決:
// 讓每一個(gè)訪問(wèn)服務(wù)器的Socket單獨(dú)放入到一個(gè)線程里,每個(gè)線程放入
// 的Socket不一致,多個(gè)線程的Socket不同,調(diào)用哪個(gè)線程的Socket就是
// 哪個(gè)人在說(shuō)話
// 單獨(dú)寫一個(gè)線程類,讓訪問(wèn)服務(wù)器的Socket通過(guò)構(gòu)造方法傳入到線程
// 類里
//原因是因?yàn)槎鄠€(gè)用戶訪問(wèn)服務(wù)器的時(shí)候,他們會(huì)進(jìn)行排隊(duì),
//第一個(gè)用戶滿意訪問(wèn)完,第二個(gè)用戶是不能訪問(wèn)的
//每一個(gè)人訪問(wèn)服務(wù)器就給當(dāng)前用戶單獨(dú)開啟一個(gè)線程
//3.接收Socket里發(fā)送的數(shù)據(jù)
//群聊
//假如有三個(gè)客戶端,客戶端1說(shuō)一句話,客戶端2
//和客戶端3收到信息,相應(yīng)的也是一樣
}
}
//接收的線程類
class fuwuqi_jieshou implements Runnable{
Socket s=null;//已經(jīng)可以得到每個(gè)人的Socket對(duì)象
//每個(gè)人的流應(yīng)該也要是自己的
DataInputStream dis=null;
DataOutputStream dos=null;
public fuwuqi_jieshou(Socket s){
try {
this.s=s;
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
} catch (Exception e) {
}
}
@Override
public void run() {
while(true){
try {
String str=dis.readUTF();
System.out.println(str);
//誰(shuí)發(fā)給服務(wù)器的內(nèi)容服務(wù)器再講這個(gè)
//內(nèi)容返回給誰(shuí)
//而是遍歷整個(gè)線程集合,判斷每個(gè)線程是不是屬于
//發(fā)送信息的線程,如果是的時(shí)候什么都不做
//不是的時(shí)候就將這個(gè)內(nèi)容轉(zhuǎn)發(fā)給其他線程
//取出他們Socket,進(jìn)行轉(zhuǎn)發(fā)
for(fuwuqi_jieshou i:TCP_fuWuQi.v_xiancheng){
if(i==this){
//屬性發(fā)送信息的線程,那就跳過(guò)
continue;
}else{
//取出他們的Socket
Socket s=i.s;
//取出他們的輸出流
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
dos.writeUTF(str);
dos.flush();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}


package TCP;
import java.net.*;
import java.util.Scanner;
import java.io.*;
public class TCP_keHuDuan {
public static void main(String[] args) throws Exception{
Scanner s1=new Scanner(System.in);
//客戶端發(fā)送數(shù)據(jù)到服務(wù)器,服務(wù)器返回?cái)?shù)據(jù)給
//發(fā)送數(shù)據(jù)的客戶端
System.out.println("客戶端3啟動(dòng)了");
//1.定義發(fā)送給誰(shuí)?
Socket s=new Socket("localhost",12345);
new Thread(new kehu_fasong(s)).start();
new Thread(new kehu_jieshou(s)).start();
}
}
//它只需要得到輸出流即可
class kehu_fasong implements Runnable{
Socket s=null;
Scanner s1=new Scanner(System.in);
DataOutputStream dos=null;
public kehu_fasong(Socket s){
try {
this.s=s;
dos=new DataOutputStream(s.getOutputStream());
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void run() {
while(true){
System.out.println("請(qǐng)輸入內(nèi)容");
String str=s1.next();
try {
dos.writeUTF(str);
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//接收只需要接收的線程即可
class kehu_jieshou implements Runnable{
Socket s=null;
DataInputStream dis=null;
public kehu_jieshou(Socket s){
try {
this.s=s;
dis=new DataInputStream(s.getInputStream());
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void run() {
while(true){
String str;
try {
str = dis.readUTF();
System.out.println(str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}


UDP傳輸
udp傳輸數(shù)據(jù)就好像在大海上運(yùn)輸貨物,DatagramSocket就像的兩個(gè)通信港口的碼頭,DatagramPacket就像在兩端運(yùn)輸貨物的輪船
發(fā)送端(send)
創(chuàng)建DatagramSocket,隨機(jī)端口號(hào)
創(chuàng)建DatagramPacket,制定數(shù)據(jù),長(zhǎng)度,地址和端口
使用DatagramSocket發(fā)送DatagramPacket
關(guān)閉DatagramSocket
異常處理

一旦成功創(chuàng)建一個(gè)Socket類的實(shí)例,可以用它來(lái)發(fā)送和接收字節(jié)流,發(fā)送時(shí)調(diào)用getOutputStream方法獲取一個(gè)java.io.OutputStream對(duì)象,接收遠(yuǎn)程對(duì)象發(fā)送來(lái)的信息可以調(diào)用getInputStream方法來(lái)返回一個(gè)java.io.InputStream對(duì)象。?
(以下觀點(diǎn)僅供參考,不一定準(zhǔn)確,其實(shí)這個(gè)世上幾乎沒(méi)有什么是可靠的,都是不一定準(zhǔn)確的,最重要的是努力提升自己各個(gè)方面的價(jià)值等)
“包”(Packet)是TCP/IP協(xié)議通信傳輸中的數(shù)據(jù)單位,一般也稱“數(shù)據(jù)包”。在局域網(wǎng)中,“包”是包含在“幀”里的。
datagram(數(shù)據(jù)報(bào)):在網(wǎng)絡(luò)層中的傳輸單元(例如IP)。
一個(gè)datagram可能被壓縮成一個(gè)或幾個(gè)packets,在數(shù)據(jù)鏈路層中傳輸。