前言
昨天剛把socket tcp編程簡單講解了诚啃,今天趁熱打鐵把udp編程也講一下浆竭。一個是為了提醒自己,堅持下去吧秕,另外還是為了提升技術(shù)打下基礎(chǔ)琉闪。如果講的有什么不對的還請各位指正。
首先
先上圖砸彬,俗話說no pic say a xx
其次
-
客戶端代碼(線程中)
public class UdpClientThread extends Thread { //IP地址 private String mAddress; //端口 private int port; //發(fā)送內(nèi)容 private String msg; private Handler mHandler; public UdpClientThread(Handler handler, String address, int port, String msg) { this.mHandler = handler; this.mAddress = address; this.port = port; this.msg = msg; } @Override public void run() { super.run(); sendSocket(); } /** * 設(shè)置 */ private void sendSocket() { byte[] bytes = msg.getBytes(); try { /*******************發(fā)送數(shù)據(jù)***********************/ InetAddress address = InetAddress.getByName(mAddress); //1.構(gòu)造數(shù)據(jù)包 DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port); //2.創(chuàng)建數(shù)據(jù)報套接字并將其綁定到本地主機上的指定端口颠毙。 DatagramSocket socket = new DatagramSocket(); //3.從此套接字發(fā)送數(shù)據(jù)報包。 socket.send(packet); /*******************接收數(shù)據(jù)***********************/ //1.構(gòu)造 DatagramPacket砂碉,用來接收長度為 length 的數(shù)據(jù)包蛀蜜。 final byte[] bytes1 = new byte[1024]; DatagramPacket receiverPacket = new DatagramPacket(bytes1, bytes1.length); socket.receive(receiverPacket); sendMsg(0,new String(bytes1, 0, bytes1.length)); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 發(fā)送消息 */ private void sendMsg(int what, Object object) { Message msg = new Message(); msg.what = what; msg.obj = object; mHandler.sendMessage(msg); } }
說明:這里的封裝和tcp中的一樣,就是換一下參數(shù)和包裝類增蹭,代碼中的解釋都比較清楚滴某。
-
客戶端(使用)
public class UdpClientActivity extends AppCompatActivity implements View.OnClickListener { Button mBtnSend; String mAddress = "192.168.0.197"; int port = 12306; TextView mTxtContent; EditText mEdtContent; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_udp_client); initView(); } private void initView() { mEdtContent = findViewById(R.id.edt_udp_content); mBtnSend = findViewById(R.id.btn_udp_send); mTxtContent = findViewById(R.id.txt_udp_content); mBtnSend.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_udp_send: { UdpClientThread mThread = new UdpClientThread(mHandler, mAddress, port, mEdtContent.getText().toString()); mThread.start(); break; } } } /** * Handler */ private Handler mHandler = new Handler(Looper.myLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: { String content = (String) msg.obj; mTxtContent.setText(content); break; } } } }; }
說明:這里直接點擊按鈕調(diào)用線程使用即可,當(dāng)然滋迈,也可以直接用線程池來構(gòu)造參數(shù)霎奢。
-
服務(wù)端(代碼)
public class UdpServer { /** * @param args */ public static void main(String[] args) { while (true) { getMsg(); } } /** * 獲取信息 */ private static void getMsg() { try { byte[] buf = new byte[1024]; // 一、接收數(shù)據(jù) // 1杀怠、創(chuàng)建接收數(shù)據(jù)的數(shù)據(jù)包 DatagramPacket packet = new DatagramPacket(buf, buf.length); // 2.創(chuàng)建UPD 的 socket DatagramSocket socket = new DatagramSocket(12306); // 3、接收數(shù)據(jù) System.out.println("服務(wù)端開始監(jiān)聽厅克!~~~~"); socket.receive(packet); // 4赔退、處理數(shù)據(jù) System.out.println("服務(wù)端:" + new String(buf, 0, buf.length)); // 二、返回數(shù)據(jù) DatagramPacket packet2 = new DatagramPacket(buf, buf.length, packet.getAddress(), packet.getPort()); socket.send(packet2); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }
最后
嘮叨一下证舟,做事一定要善始善終硕旗,做人一定要誠信(ps:最近遇到了一個不誠信的公司,offer發(fā)了之后女责,第二天告訴我不用去了漆枚,問過原因之后,人事和老板助理回復(fù)還不一樣抵知,這樣就有點好玩了墙基,真的是越想越生氣。尤其是對于我這種對誠信比較看重的人刷喜,真的是不能忍残制。特別痛恨那種答應(yīng)別人卻做不到的人,要不就別答應(yīng)掖疮,要不就做到初茶。我一般答應(yīng)別人的事情,一定會做到浊闪,不管我要付出什么恼布,起碼我兌現(xiàn)了自己的承諾螺戳。)。發(fā)了一頓牢騷折汞,還請各位看官見諒倔幼。