java datagramsocket_Java传输当前日期,TCP网络编程,Socket,UDP传输,DatagramPacket【诗书画唱】...

用上TCP,先启动服务器的部分,之后开启客户端,之后用客户端发送信息给服务器3ef05b64d2040dd2360b467d7e23f9e9.png

package TCP;

import java.io.*;

import java.net.*;

public class TCP服务器 {

public static void main(String[] args) throws Exception{

System.out.println("用TCP启动了服务器");

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("给诗书画唱三连关注");

System.out.println("接收到的客户端发送来"

+ "的内容为"+new String(b,0,b.length));

}

}

ServerSocket.close();

}

}

ab3fee48a8341739f508866c3b442888.png

c56255396d091d5e6c53ee482f282262.png

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("启动了客户端");

//什么是Socket 在计算机通信领域,socket 被翻译为“套接字”,

//它是计算机之间进行通信的一种约定或一种方式

Socket s=new Socket("localhost",8888);

Scanner s1=new Scanner(System.in);

while(true){

System.out.println("请输入内容");

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();

}

}

8f3a0c0fcbca381419e7d798f0398c34.png

a9b385cdb2c03a036efc1e228d6171a1.png

bd3ae06aae61ef156f3f1982af15a416.png

用UDP协议来用客户端把当前的日期传给服务端956031af09a7cd239d31aa081e1d4e0c.png

——————bd87d67632a3aea371399469f6000459.png

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("服务器端启动成功!先启动服务端之后启动"

+ "客户端,"

+ "\n之后客户端会把当前的日期发送到服务端");

//datagram:

//数据报; 数据包; 数据报文; 數據報; 数据表;

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(),读传入过来的数据。

//ByteArrayInputStream:可以得到字节,但是不能转int。

//ObjectInputStream:可以转int。

ByteArrayInputStream ByteArrayInputStream

=new ByteArrayInputStream(byteArray,0,len);

//

//ObjectInputStream为对象输入流,

//把ByteArrayInputStream放到对象输入流的“()”里,

//就可以把内容转为int类型的数据。

ObjectInputStream ObjectInputStream

=new ObjectInputStream(ByteArrayInputStream);

Date Date =(Date)ObjectInputStream.readObject();

System.out.println(Date.toLocaleString());

DatagramSocket.close();

}

}

b95fe635c0ad8e6a1523af36c7258b49.png

54745e57085392faae6ea2ea7619d16c.png

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:将内容可以转为字节的流

//ObjectOutputStream:对象必须序列化,另外对象也要转为字节流

System.out.println("客户端启动了");

DatagramSocket DatagramSocket=new DatagramSocket(12345);

Date Date=new Date();

//int类型不能直接转字节数组

//ByteArrayOutputStream:转字节(不能读int)

//ObjectOutputStream:这个可以读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和自定义一个用户名和密码试一下

//class yonghu implements Serializable{

//

//}18da9c8ffa65935b8f6a6ceed968e128.png

64faa647addb541205c160c939bc9737.png

package TCP;

import java.net.*;

import java.io.*;

import java.util.*;

public class TCP_fuWuQi {

//现在是每个人的Socket保存在对应的线程里

//声明一个集合用来保存每个线程,打印的时候就是遍历保存

//线程的集合,

static Vector v_xiancheng=new Vector();

public static void main(String[] args) throws Exception{

System.out.println("服务器启动了");

//1.定义服务器对象

ServerSocket ss=new ServerSocket(12345);

//2.使用服务器对象进行堵塞性接收数据

System.out.println("服务器等待用户传输数据");

while(true){

Socket s=ss.accept();

System.out.println("一个用户建立了链接");

fuwuqi_jieshou fj= new fuwuqi_jieshou(s);

//将每个人的线程保存在线程集合里

v_xiancheng.add(fj);

new Thread(fj).start();

}

//每一个客户端访问服务器他们使用的是自己的额Socket,

//现在造成的原因是多个人去访问的时候,他们用的是同一个Socket

//就会造成堵塞,当前Socket没有被释放掉,其他Socket进不来,就会

//造成只有一个人可以说话

//

//如何解决:

//让每一个访问服务器的Socket单独放入到一个线程里,每个线程放入

//的Socket不一致,多个线程的Socket不同,调用哪个线程的Socket就是

//哪个人在说话

//单独写一个线程类,让访问服务器的Socket通过构造方法传入到线程

//类里

//原因是因为多个用户访问服务器的时候,他们会进行排队,

//第一个用户满意访问完,第二个用户是不能访问的

//每一个人访问服务器就给当前用户单独开启一个线程

//3.接收Socket里发送的数据

//群聊

//假如有三个客户端,客户端1说一句话,客户端2

//和客户端3收到信息,相应的也是一样

}

}

//接收的线程类

class fuwuqi_jieshou implements Runnable{

Socket s=null;//已经可以得到每个人的Socket对象

//每个人的流应该也要是自己的

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);

//谁发给服务器的内容服务器再讲这个

//内容返回给谁

//而是遍历整个线程集合,判断每个线程是不是属于

//发送信息的线程,如果是的时候什么都不做

//不是的时候就将这个内容转发给其他线程

//取出他们Socket,进行转发

for(fuwuqi_jieshou i:TCP_fuWuQi.v_xiancheng){

if(i==this){

//属性发送信息的线程,那就跳过

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();

}

}

}

}

8ed7157828cc4f365802cd5cb97c35c2.png

0e6fcdd5ae87e6e0a9788ff869a4a249.png

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);

//客户端发送数据到服务器,服务器返回数据给

//发送数据的客户端

System.out.println("客户端3启动了");

//1.定义发送给谁?

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("请输入内容");

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();

}

}

}

}

b6f27db2b417373a8fba028528d4a3b5.png

2e1492239dc5d542c95523685e776ad7.png

UDP传输

udp传输数据就好像在大海上运输货物,DatagramSocket就像的两个通信港口的码头,DatagramPacket就像在两端运输货物的轮船发送端(send)创建DatagramSocket,随机端口号

创建DatagramPacket,制定数据,长度,地址和端口

使用DatagramSocket发送DatagramPacket

关闭DatagramSocket

异常处理

4e0624ba10f1735ab97a6867a6c8b16d.png

一旦成功创建一个Socket类的实例,可以用它来发送和接收字节流,发送时调用getOutputStream方法获取一个java.io.OutputStream对象,接收远程对象发送来的信息可以调用getInputStream方法来返回一个java.io.InputStream对象。

【以下观点仅供参考,不一定准确,其实这个世上几乎没有什么是可靠的,都是不一定准确的,最重要的是努力提升自己各个方面的价值等】

“包”(Packet)是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。在局域网中,“包”是包含在“帧”里的。

datagram(数据报):在网络层中的传输单元(例如IP)。

一个datagram可能被压缩成一个或几个packets,在数据链路层中传输。】

5ecd7e11bc2965daa229161f57df1611.png

77aa7def884b0e9bed8b0ad1653886a6.png

37e8852a66135867a3f458740bc132f0.png

109d68b357f19d853781fcdec0e385c5.png

848de86745e607ae1d5bd4f6da85d345.png

a03ca6ff5e6171cde0d24cefd172acc4.png

4148a4f979fa4a9912fd0154008bb75b.png

455412d46984fa8f77931d1697c27e4e.png

a7177eee3a352f8bdfc3f3a6796e8c0f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值