关于java的UDP通信问题。。。。。。。

我建立了两个客户端和一个服务端,一个客户端发消息给服务器,然后服务器转发给另一个客户端。问题是这样的,客户端1发了一个消息1给服务器然后转发给客户端2,然后这时候要是客户端2要给客户端1发个消息2的话,客户端1却是收到刚刚发出去的消息1,客户端2再发消息的时候就正常了,消息2不知道哪里去了,调试的时候客户端2发的消息2是有传送到服务器的,可是服务器再发出去的时候就变了
图片说明

服务器程序:
import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.*;
import java.sql.*;

public class UDPServerService {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws SQLException {
    // TODO code application logic here
   // if(args.length<1)
    // {
    // System.out.println("请输入用于mail服务的本地端口号");
    //    System.exit(0);
   // }
     int i=8000;
   //  String s=Integer.toString(i);
     UDPServerThread myUDPServer=new UDPServerThread(8000);//创建邮件服务器监听线程
     myUDPServer.init();
     Thread th=new Thread(myUDPServer);
    th.start();
}

}
class UDPServerThread extends Frame implements Runnable
{
private DatagramSocket UDPServerSocket=null,UDPServerSocket1=null;
PreparedStatement ps;
TextArea ta=new TextArea(10,50);
JButton close;
Connection con;
Statement stmt;
ResultSet rs;
String sql;
int flag=0;
int ports;
void init(){
close=new JButton("close");
setTitle("服务监听器");
setSize(400,300);
setLayout(new FlowLayout());
add("center",ta);
add(close);
close.addActionListener(new Close());
setVisible(true);

}
UDPServerThread(int Port){

ports=Port;
try{
UDPServerSocket=new DatagramSocket(Port);
UDPServerSocket1=new DatagramSocket(Port+1);
ta.append("邮件服务监听器在端口"+UDPServerSocket.getLocalPort()+"\n");
}catch(Exception e){
System.err.println(e);
}
}

public void run(){

if(UDPServerSocket==null)
return;
while(true){
try{

    byte[] dataBuf=new byte[512];
    DatagramPacket ServerPacket;
    InetAddress remoteHost;

    int remotePort;
    String datagram,s;

    ServerPacket =new DatagramPacket(dataBuf,512);
    UDPServerSocket.receive(ServerPacket);//接受
    remoteHost=ServerPacket.getAddress();
    remotePort=ServerPacket.getPort();

    datagram=new String(ServerPacket.getData());

       String sql="SELECT * FROM biao1";
 try{
 Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
con=DriverManager.getConnection("jdbc:ucanaccess://D:\\access\\db1.mdb","","");
stmt=con.createStatement();
rs=stmt.executeQuery(sql);

}catch(Exception e1){
e1.printStackTrace();
} 
 if(datagram.contains("#dl#")){
 while(rs.next()){                         //验证帐号密码是否正确
    if((datagram.indexOf(rs.getString("username"))!=-1)&&(datagram.indexOf(rs.getString("password")))!=-1){
       String pass="connect";
       dataBuf=pass.getBytes();
       ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
       UDPServerSocket.send(ServerPacket);
        ta.append("用户"+remoteHost+"已登录"+'\n');
       flag=1;
       sql="UPDATE biao1 SET connection=?  WHERE username=?";        
       ps=con.prepareStatement(sql);
       ps.setInt(1,1);
       ps.setString(2, rs.getString("username"));
       ps.executeUpdate();                                            //表1中设置该用户为在线状态
       sql="UPDATE biao1 SET remoteHost=?  WHERE username=?";
       ps=con.prepareStatement(sql);

       ps.setString(1,remoteHost.toString());
       ps.setString(2, rs.getString("username"));
       ps.executeUpdate();                                             
       sql="UPDATE biao1 SET remotePort=?  WHERE username=?";
       ps=con.prepareStatement(sql);
       ps.setInt(1, remotePort);     

       ps.setString(2, rs.getString("username"));
       ps.executeUpdate();                                           //修改表中用户的登录地址,登录端口

       con.commit();
       con.close();

    }



 }
 if(flag==0){
     String lost="lost";
    dataBuf=lost.getBytes();
       ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
       UDPServerSocket.send(ServerPacket);

 }
 }
    else{
     sql="SELECT * FROM biao1";
     ResultSet rt;
    rt=stmt.executeQuery(sql);
    int port=0;
    //ta.append('\n'+"收到如下主机发来的邮件"+remoteHost.getHostName()+":\n"+datagram);
    while(rt.next()){

        if(datagram.indexOf(rt.getString("username"))!=-1){
            if(rt.getString("connection").indexOf("1")!=-1){

                InetAddress remoteHost1=InetAddress.getByName(rt.getString("remoteHost").substring(1));

                int remotePort1=rt.getInt("remotePort");
                 port=remotePort1+1;
                 dataBuf=new byte[512];
               dataBuf=datagram.getBytes();
               System.out.print(datagram);
               ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost1,port);
               UDPServerSocket1.send(ServerPacket);

            }
            else{
              datagram=new String("unconnect.");
              dataBuf=new byte[512];
              //remoteHost=InetAddress.getByName("QH-20150828KDPO");

              dataBuf=datagram.getBytes();
              ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
              UDPServerSocket.send(ServerPacket);

            }

    }

    }

 }


 }catch(Exception e){
 System.err.println(e);
 }

}

}

protected void finalize(){
if(UDPServerSocket!=null){
UDPServerSocket.close();
UDPServerSocket=null;
ta.append("关闭服务器端的数据报连接!");
}

}

}

class Close implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}

}

客户端程序:

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import static java.lang.Thread.sleep;
import java.util.Scanner;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
public class UDPClientService1 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args){
    // TODO code application logic here
     Dl d=new Dl(args);

}
}
class UDPClientService extends Frame implements ActionListener,Runnable{
DatagramSocket UDPClientSocket;
DatagramPacket ClientPacket;
InetAddress remoteHost;
int remotePort;
byte[] dataBuf;
String datagram;
private String send="";
String args[]=new String[3];
Scanner in;
TextArea ta_receive=new TextArea(10,60),ta_send=new TextArea(5,60);
JButton ok=new JButton("ok"),close =new JButton("close"),test=new JButton("test");
JPanel p3=new JPanel(),p1=new JPanel(),p2=new JPanel();

void Init_Frame(){
    setTitle("服务器端口1");
   setSize(500,450);
   setLayout(new BorderLayout());

   ta_receive.setEditable(false);
   ta_send.requestFocus();
   add(p1,BorderLayout.NORTH);
   add(p2,BorderLayout.CENTER);
   add(p3,BorderLayout.SOUTH);
   p1.add(ta_receive);
   p2.add(ta_send);
   p3.add(ok);
   p3.add(close);
   p3.add(test);
   ok.addActionListener(this);
   close.addActionListener(this);
   test.addActionListener(this);
   setVisible(true);


}

void Init(String args[]){
this.args=args;
if(args.length<3){
ta_receive.append("请输入本地端口号,远程服务器主机号及端口名");
System.exit(0);

}

try{

UDPClientSocket =new DatagramSocket(Integer.valueOf(args[0])+1);

remoteHost=InetAddress.getByName(args[1]);
remotePort=Integer.parseInt(args[2]);


}catch(Exception e){
System.err.println(e);
}

}
public void run(){
while(true){
try {
dataBuf=new byte[512];
ClientPacket=new DatagramPacket(dataBuf,512);
UDPClientSocket.receive(ClientPacket);//接受
datagram=new String(ClientPacket.getData());
System.out.print(datagram);
ta_receive.append('\n'+"Server:"+'\n');
ta_receive.append(" "+datagram+'\n');

     } catch (IOException ex) {
         Logger.getLogger(UDPClientService.class.getName()).log(Level.SEVERE, null, ex);
     }

}
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==ok){
try{

        in=new Scanner(ta_send.getText());
        //int port=Integer.valueOf(args[0])+2;
        ta_receive.append('\n'+"Client:"+'\n'+""+ta_send.getText()+'\n'+'\n');
       // UDPClientSocket1 =new DatagramSocket(port);

        datagram=send+in.nextLine();

        dataBuf=datagram.getBytes();
        ClientPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
        UDPClientSocket.send(ClientPacket);//发送
    ta_send.setText("");


    }catch(IOException e1){
        System.err.println(e1);
    }

}
else if(e.getSource()==close){

 dispose();
 System.exit(0);
}
else if(e.getSource()==test){
send="lijing";
}

}
}

class Dl extends Frame implements ActionListener{
JTextField t1=new JTextField(10),t2=new JTextField(10);
JButton ok=new JButton("ok"),close=new JButton("close");
JLabel l=new JLabel("tips"),username1=new JLabel("username"),password1=new JLabel("password");
String args[]=new String[3];
Panel p1=new Panel(),p2=new Panel(),p3=new Panel(),p4=new Panel();
private String name,password,s;
DatagramSocket UDPClientSocket;
DatagramPacket ClientPacket;
InetAddress remoteHost;
int remotePort;
byte[] dataBuf;
String datagram;
String flags="#dl#";
Dl(String args[]){
this.args=args;

 try{
 UDPClientSocket =new DatagramSocket(Integer.parseInt(args[0]));
 remoteHost=InetAddress.getByName(args[1]);
 remotePort=Integer.parseInt(args[2]);
 }catch(Exception e){
System.err.println(e);
}
setLayout(new BorderLayout());

setSize(200,150);
p1.add(username1);
p1.add(t1);
p1.add(password1);
p1.add(t2);
p1.add(ok);
p1.add(close);
p2.add(l);
add(p1,BorderLayout.CENTER);
add(p2,BorderLayout.SOUTH);

ok.addActionListener(this);
close.addActionListener(this);
setVisible(true);

}
public void actionPerformed(ActionEvent e){
if(e.getSource()==ok){
try{

name=t1.getText();
password=t2.getText();
s=flags+name+password;
dataBuf=s.getBytes();
 ClientPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
 UDPClientSocket.send(ClientPacket);//发送

  dataBuf=new byte[512];
  ClientPacket=new DatagramPacket(dataBuf,512);
  UDPClientSocket.receive(ClientPacket);//接受
  datagram=new String(ClientPacket.getData());

  if(datagram.contains("connect")){
   UDPClientService ucs=new UDPClientService();
    ucs.Init_Frame();
    ucs.Init(args);
    setVisible(false);
    Thread th=new Thread(ucs);
   th.start();
  }
  else{
  l.setText("error!!");

  }


 }catch(IOException e1){
     System.err.println(e1);
 }

}
else if(e.getSource()==close){

    dispose();
    System.exit(0);

}

}
}

1个回答

你的代码在哪里?没有代码要排错,难度太大了吧?

qq_34475098
qq_34475098 补充了
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
问个关于java Socket UDP通信转码问题
发送端: public class UDPSend { public static void main(String[] args) throws IOException { DatagramSocket ds =new DatagramSocket(); BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//输入数据 String line=null; while((line=br.readLine())!=null) { if("886".equals(line)) { break; } byte[] b=line.getBytes(); DatagramPacket dp=new DatagramPacket (b,b.length,InetAddress.getByName("192.168.252.1"),3303); ds.send(dp); } ds.close(); } } 接收端: public class UPDReceive { public static void main(String[] args) throws IOException { DatagramSocket ds=new DatagramSocket(3303); while(true) { byte[] b=new byte[1024]; DatagramPacket dp=new DatagramPacket(b,b.length); ds.receive(dp); String ip=dp.getAddress().getHostAddress(); String s=new String(dp.getData(),0,dp.getLength(),"UTF-8"); System.out.println("ip:"+ip+",字符串:"+s); } } } 结果我在发送端输入"你好“,接收端的结果是:ip:192.168.252.1,字符串:浣犲ソ 字符串的内容并没有转码。我这个项目的Text file encoding属性也设置成UTF-8了 为什么结果没有转码呢???求大神解答。。
关于Java网络通信_UDP的几个问题
UDP发送端:<br> DatagramPacket dp=new DatagramPacket(buf, length, address, port);<br> 其中,buf指所需要发送的数据,length指的是包的长度(官方文挡解释)。 问题1:若buf长度为很大,远大于length,那么上面的语句是将数据打包成一个数据丢失的数据包还是多个长度为length的数据包? <hr> UDP接收端:<br> DatagramSocket ds=new DatagramSocket(10086);<br> byte[] buf=new byte[1024];<br> int length=buf.length;<br> DatagramPacket p=new DatagramPacket(buf, length);<br> ds.receive(p);<br> 问题2:DatagramPacket用来接收长度为length的数据包,若发送端数据包长度为1024,接收端在此的length设为100,数据是否会丢失?<br> 问题3:receive(p)方法到底接收的是一个包还是所有的包?
JAVA中UDP通信如何接收我写的方法?
public static byte[] Point(String inputStr,int len){ byte[] result = new byte[inputStr.length() / 2]; for (int i = 0; i < inputStr.length() / 2; ++i) result[i] = (byte)(Integer.parseInt(inputStr.substring(i * 2, i * 2 +2), 16) & 0xff); return result; } UDP通信接收怎么写呢?
java用udp进行服务器通信,做聊天程序
java用udp进行服务器通信,做聊天程序,怎么将接收方的信息,放在发送内容里面来完成。tcp模式可以用序列化方式来完成,udp用什么方法,必须用正则方法,来找出接收方信息吗。
JAVA UDP协议下怎么样才能突破局域网内的双向通信啊?求高人务必指导下。。。。
本人是个接触JAVA2个月的菜鸟,最近在研究UDP广域网的通信,实现的过程也就是常说的双向通信:客户端(局域网内)先发数据给远方的服务器(服务器是公网IP,映射了个端口),服务器能收到,但是服务器不能回发数据给客户端。。。对于这方面的问题,在网上找了很多资料,全是局域网内的,网上说什么UDP打洞啊,穿透啊等等的,说实话有点晕,直到有一天在网上一个论坛看到同样类似的帖子,主人说根本就不需要什么UDP打洞这类的做法,只需要地址解析。。。。那么我想请问有没有什么方法来解决这个问题啊?此外,有个sockettools2调试工具,能在上面实现广域网UDP通信功能。求大神指点啊!
android/java 虚拟局域网UDP通信,客户端无法接收服务端发来的UDP包
客户端在外网,通过PPTP方式连接某个局域网后,局域网内的服务端可以接受到客服端发来的UDP包,但客服端无法接收到服务端发过去的UDP包,为什么?是PPTP连接方式的问题吗?
关于Android利用局域网进行UDP通信的问题
我写了一个小程序准备利用UDP和电脑之间进行通信,然后基于这个做一点东西,可是问题是我用AVD测试很好用的,但是用真机测试就是不行。 我的思路是让电脑和Android设备连接一台路由器,路由器为两台设备分配固定的ip地址进行通信。 拜托大家帮我看看啊,我这才是第一步就郁闷的要死 下面是代码。 1:MainActivity package com.company.zebork.testudpll; import android.app.Activity; import android.content.Context; import android.net.wifi.WifiManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { EditText text; Button send; Handler handler; Message msg; EditText ad; String address; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (EditText) findViewById(R.id.editText); send = (Button) findViewById(R.id.send); ad = (EditText) findViewById(R.id.editText2); handler = new Handler() { @Override public void handleMessage(Message msg) { text.setText(""); } }; /* send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handler.handleMessage(msg); } });*/ send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { System.out.println(ad.getText().toString()); AsyncTask<String ,String , Void> toSend = new AsyncTask<String, String, Void>() { @Override protected Void doInBackground(String... params) { address = ad.getText().toString(); UDPClient client = new UDPClient(address); System.out.println("here" + address); client.send(text.getText().toString()); msg = new Message(); handler.sendMessage(msg); return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); } }.execute(address); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 2、UDPClient package com.company.zebork.testudpll; import java.io.IOException; import java.net.*; public class UDPClient { private DatagramPacket dp; private DatagramSocket ds; private byte[] buf; private String address; public UDPClient(String address) { buf = new byte[4096]; this.address = address; System.out.println("??" + address); try { ds = new DatagramSocket(8888); } catch (SocketException e) { e.printStackTrace(); } } public void send(String str) { buf = str.getBytes(); try { dp = new DatagramPacket(buf, buf.length,new InetSocketAddress(address,5679)); ds.send(dp); ds.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 3、AndroidManifest【有些权限我都没有用到,因为调试这个错误才加上的】 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.zebork.testudpll" > <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 4、activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText2" android:layout_gravity="center_horizontal" android:text="ip" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送" android:id="@+id/send" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:layout_gravity="center_horizontal" /> </LinearLayout> 5、服务器的Java文件,我是用JavaSE写的,因为不会javaEE import java.io.IOException; import java.net.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestUDPClient extends Frame{ private static DatagramPacket dp; private static DatagramSocket ds; private static TextField text; private static TextArea ta; public static void main(String[] args) { Frame f = new TestUDPClient(); f.setLocation(200, 200); f.setSize(300,200); f.setVisible(true); text = new TextField(); ta = new TextArea(); f.add(text,BorderLayout.SOUTH); f.add(ta,BorderLayout.CENTER); f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { if(ds!=null) ds.close(); System.exit(0); } }); startServer(); } public static void startServer() { byte[] buf = new byte[4096]; dp = new DatagramPacket(buf,buf.length); try { ds = new DatagramSocket(5679); } catch (SocketException e) { e.printStackTrace(); } while(true) { try { ds.receive(dp); if(ta.getText().length() > 0) ta.setText(ta.getText() + "\n" + new String(buf,0,dp.getLength())); else ta.setText(new String(buf,0,dp.getLength())); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
Java小白急求大神指教。
//启动Receive线程 public class Demo2 { public static void main(String[] args) { Receive receive = Receive.getConstructor(); new Thread(receive).start(); } } ``` //Receive线程类 服务端 import java.io.IOException; import java.net.*; import java.util.Scanner; class Receive implements Runnable{ private final int port = 22222; private static InetAddress localHost; private static volatile SocketAddress socketAddress; private static volatile Scanner scanner = new Scanner(System.in); private static volatile boolean send = true; private static Receive receive; private static Thread thread; static { try { localHost = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } } static volatile DatagramSocket socket = null; { try { socket =new DatagramSocket(port, localHost); } catch (SocketException e) { e.printStackTrace(); } } private Receive(){} static Receive getConstructor(){ if(socket == null){ receive = new Receive(); thread = new Thread(receive, "send"); thread.setDaemon(true); return receive; } return receive; } @Override public void run() { String name = Thread.currentThread().getName(); if(name.equals("send")){ send(); }else { receive(); } } //发送消息方法 public static void send() { DatagramPacket sendPacket = null; byte[] sendByte = new byte[1024]; String sendMiss = null; sendPacket = new DatagramPacket(sendByte, sendByte.length, socketAddress); while (send){ sendMiss = scanner.next(); //scanner.close(); sendByte = sendMiss.getBytes(); sendPacket.setData(sendByte); try { socket.send(sendPacket); } catch (IOException e) { e.printStackTrace(); } } } //接收消息方法 public static void receive(){ DatagramPacket receivePacket = null; byte[] receiveByte = new byte[1024]; String string = null; receivePacket = new DatagramPacket(receiveByte, receiveByte.length); int i = 0; System.out.println("服务端已启动。。。"); while (send){ try { socket.receive(receivePacket); } catch (IOException e) { e.printStackTrace(); } socketAddress = receivePacket.getSocketAddress(); if(i == 0){ thread.start(); i = 1; } int length = receivePacket.getLength(); string = new String(receiveByte, 0, length); if(string.equals("exit")){ socket.close(); send = false; //scanner.close(); //threradStop(); System.out.println("服务端已关闭通信"); }else{ System.out.println("服务端接受到的消息是:" + string); } } } } ``` //用来启动Send线程类 public class Demo { public static void main(String[] args) { Send send = new Send(); new Thread(send, "send").start(); new Thread(send).start(); } } ``` //Send线程类 客户端 import java.io.IOException; import java.net.*; import java.util.Scanner; class Send implements Runnable{ final int port = 11001; static InetAddress localHost; static { try { localHost = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } } static DatagramSocket socket; { try { socket = new DatagramSocket(port, localHost); } catch (SocketException e) { e.printStackTrace(); } } static Scanner scanner = new Scanner(System.in); static volatile boolean send = true; @Override public void run() { String name = Thread.currentThread().getName(); if(name.equals("send")){ send(); }else { receive(); } } //发送消息方法 private static void send(){ DatagramPacket sendPacket = null; byte[] sendByte = new byte[1024]; try{ while(send){ sendPacket = new DatagramPacket(sendByte, sendByte.length, localHost, 22222); String sendString = scanner.nextLine(); if(sendString.equals("exit")){ sendByte = sendString.getBytes(); sendPacket.setData(sendByte); //System.out.println(Arrays.toString(sendByte)); socket.send(sendPacket); scanner.close(); socket.close(); send = false; }else{ sendByte = sendString.getBytes(); sendPacket.setData(sendByte); //System.out.println(Arrays.toString(sendByte)); socket.send(sendPacket); } } } catch (SocketException | UnknownHostException e) { e.printStackTrace(); } catch ( IOException e) { e.printStackTrace(); } } //接收消息方法 private static void receive(){ DatagramPacket receivePacket = null; byte[] receiveByte = new byte[1024]; String receiveMiss = null; receivePacket = new DatagramPacket(receiveByte, receiveByte.length); try { while (!socket.isClosed()){ socket.receive(receivePacket); //这里是88行,等待接收 receiveMiss = new String(receiveByte); System.out.println("客户端接收到的消息是:" + receiveMiss); } } catch (IOException e) { e.printStackTrace(); } } } ``` ![图片说明](https://img-ask.csdn.net/upload/202004/01/1585740937_287837.png) 在UDP中两个线程公用一个socket,一个线程等待接收数据堵塞,另一个线程关闭socket,就会报出图片上的错误,前面是我写的代码,这个问题怎么解决,求指教。。。如果对代码有指教,请指教。。。
JAVA UDP通信为什么只能接收一次数据,我想要时刻接收数据,并更新UI,大神们帮我看看程序吧?
// 与UDP数据接收线程通信更新UI线程中EditText控件中的内容 receiveHandler = new Handler() { public void handleMessage(Message msg) { point2.setText(receiveInfo); } }; } // UDP数据接收线程 public class udpReceiveThread extends Thread { @Override public void run() { try { socket = new DatagramSocket(8081); listenStatus = true; while (listenStatus) { // byte[] inBuf= new byte[1024]; byte[] inBuf = new byte[1024]; DatagramPacket inPacket = new DatagramPacket(inBuf, inBuf.length); socket.receive(inPacket); String str = new String(inPacket.getData()); receiveInfo = Change1(str, inPacket.getLength()).trim(); // receiveInfo = new String (inPacket.getData()); // receiveInfo= stringtopoint(inBuf,inPacket.getLength()); socket.close(); Message msg = new Message(); receiveHandler.sendMessage(msg); try {Thread.sleep(100); } catch (Exception e) { // TODO: handle exception } } } catch (Exception e) { e.printStackTrace(); // TODO Auto-generated catch block } } } // 发送按钮单击事件 public void SendButtonClick(View source) { new udpSendThread().start(); } // 监听按钮点击事件 public void ListenButtonClick(View source) { if (listenStatus == false) { stop.setText("停止监听"); new udpReceiveThread().start(); } else { stop.setText("开始监听"); socket.close(); listenStatus = false; new udpReceiveThread().interrupt(); } } // 数据处理 public static String Change1(String str, int len) { if (str == null || str.equals("")) { return null; } String hexString = str.replace(" ", ""); String ret = ""; char[] hexChars = hexString.toCharArray(); for (int i = 0; i < hexChars.length; i++) { if ((hexChars[i] == 'p') & (hexChars[i + 1] == '1') & (hexChars[i + 2] == 'r') & (hexChars[i + 3] == '!')) { String p = Integer .toString((CharToHex(hexChars[i + 7]) << 12) | (CharToHex(hexChars[i + 8]) << 8) | (CharToHex(hexChars[i + 9]) << 4) | CharToHex(hexChars[i + 10])); i=i+13; return p; } else { i=1+1; } } return null; } 比如我发送了p1r!p1r003B1s!p1r!p1r001A1s!,程序只处理了p1r!p1r003B1s!这句话,把我需要的003B提取出来了,更新ui,为什么不能继续处理后面的数据,继续更新ui呢?请大神赐教!
android开发使用UDP进行通信中通过DatagramSocket创建对象抛出异常
我是刚来的,没有c币,求好心人帮忙解答,谢谢谢谢!!!! package com.example.practice; import java.net.DatagramSocket; import java.net.SocketException; import android.os.Bundle; import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new kaishi().start(); } class kaishi extends Thread{ @Override public void run() { // TODO Auto-generated method stub System.out.println("01"); try { System.out.println("03"); DatagramSocket socket =new DatagramSocket(50000); //异常,原因 套接字不能被打开 System.out.println("05"); } catch (SocketException e) { System.out.println("02"); // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("04"); } } } ·················································································· 以上是一个android软件一个代码,目的是用UDP协议进行手机之间的通信,代码内容仅仅就是创建一个DatagramSocket对象。问题是:每次程序进行到创建DatagramSocket对象的时候都会抛出异常,用真机测试输出结果是:01 03 02 04。这是在Android的工程中写的,在java工程中就可以成功创建,语法是按照Java的API写的,但每次都抛出异常,网上说是因为端口号被占用才抛出异常,换了好几个端口号还是会抛出异常。求可以成功创建DatagramSocket对象的方法.
JAVA编程自动获取本机IP地址
在学习UDP通信时,我们总是需要对方相互告知自己的IP地址后,才能进行同信, 因此,我想在对方运行程序的时候就自己的IP地址自动获取并返回给对方!
基于Android 实现局域网内设备之间的通信(物联网)
1.硬件设备有,称重机器,网络摄像头,还有主控机器(单片机,modbus协议),主要是通过手机端的Android应用程序去控制主控设备进行拍照和称重等操作,然后把数据上传到服务器,除了手机把采集到的信息上传到服务器以外的一切操作是基于局域网去完成的,不需要外网。我现在遇到的问题是不知道怎么在android 应用程序(已经开发了的)当中添加这部分功能。该怎么上手?有没有大神可以帮我分析一下?小型局域网,用tcp协议好还是udp协议好?
为什么我android UDP通信 只能发信息接收不到信息。请大神帮忙
主进程 import android.support.v7.app.ActionBarActivity; import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class YuntuActivity extends ActionBarActivity implements OnClickListener { private TextView adSpeed; private TextView reSpeed; private TextView reTxt; private Button btnHeadCar; private Button btnAgree; private Button btnApply; private Button btnStart; private Button btnExit; //自定义变量 private String remoteIP = null; private int rePort = 0; private int loPort = 0; private UDPThread reTxtThread = null; private UDPThread adSpeedThread = null; private UDPThread reSpeedThread = null; private String sendStr = null;//发送的字符串 private String receStr = null; Handler mhander = new Handler() { public void handleMessage(Message msg) { Bundle bundle =new Bundle(); bundle = msg.getData(); receStr = bundle.getString("info"); reTxt.setText(receStr); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_yuntu); //初始化UI initUI(); //初始化 init(); reTxtThread = new UDPThread(mhander); } private void init() { remoteIP = "172.22.130.124"; rePort = 8801; loPort = 8805; } //初始化UI private void initUI() { adSpeed =(TextView)findViewById(R.id.AdSpeed); reSpeed =(TextView)findViewById(R.id.ReSpeed); reTxt =(TextView)findViewById(R.id.reTxt); btnHeadCar =(Button)findViewById(R.id.button1); btnAgree =(Button)findViewById(R.id.button2); btnApply =(Button)findViewById(R.id.button3); btnStart =(Button)findViewById(R.id.button4); btnExit =(Button)findViewById(R.id.button5); } @Override public void onClick(View v) { switch (v.getId()) { //点击 同意入队 按钮 case R.id.button1: sendStr = "you can join in flownteam."; if(!sendStr.trim().equals("")) { reTxtThread.sendData(sendStr); } break; //点击 申请入队按钮 case R.id.button2: sendStr = "Can I join in?"; if(!sendStr.trim().equals("")) { reTxtThread.sendData(sendStr); } break; //点击申请离队按钮 case R.id.button3: sendStr = "Can I exit?"; if(!sendStr.trim().equals("")) { reTxtThread.sendData(sendStr); } break; //点击开始监听按钮 case R.id.button4: reTxtThread.setReomteIP(remoteIP); reTxtThread.setRePort(rePort); reTxtThread.setLoPort(loPort); boolean connResult = reTxtThread.connectSocket(); if(connResult) { Toast.makeText(getApplicationContext(), "链接建立完毕!", Toast.LENGTH_SHORT).show(); } break; //点击关闭监听按钮 case R.id.button5: reTxtThread.disConnectSocket(); Toast.makeText(getApplicationContext(), "链接已经关闭!", Toast.LENGTH_SHORT).show(); break; default: break; } } } 子线程:接收和发送UDP包 package com.example.cqput_yuntu2; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.text.SimpleDateFormat; import java.util.Date; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.TextView; public class UDPThread implements Runnable { // 定义变量 private TextView rTextView = null; private String reomteIP = null; private int rePort = 0; private int loPort = 0; private Thread rThread = null; private static String CHARECTER = "UTF-8"; private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // 接收 private byte[] rBuffer = new byte[1024]; private DatagramSocket rSocket = null; private DatagramPacket rPacket = null; private String rStr = null; // 发送 private DatagramSocket sSocket = null; private DatagramPacket sPacket = null; private byte[] sBuffer = new byte[1024]; public Handler mhandler; public UDPThread(Handler handler) { mhandler = handler; } @Override public void run() { // 开始接收数据 Looper.prepare(); if (Thread.currentThread() == rThread) { System.out.println("------jieshouqian"); rStr = receiveData(); System.out.println("------jieshouhou"); Message toMain = mhandler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("info", rStr); toMain.setData(bundle); mhandler.sendMessage(toMain); } ; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 开始接收数据 private String receiveData() { try { ByteArrayInputStream bais = new ByteArrayInputStream(rBuffer); DataInputStream dis = new DataInputStream(bais); if (rSocket == null) { rSocket = new DatagramSocket(8805); } if (rPacket == null) { rPacket = new DatagramPacket(rBuffer, rBuffer.length); } System.out.println("----rece"); rSocket.receive(rPacket); System.out.println("------receHou"); rStr = dis.readUTF().trim(); System.out.println("------jieBeg"); rStr = String.format("[%s:%d//%s]%s", rPacket.getAddress() .getHostAddress(), rPacket.getPort(), sdf .format(new Date()), rStr); return rStr; } catch (Exception e) { e.printStackTrace(); System.out.println("-----------------recvdata error:" + e.getMessage()); } return null; } // 建立连接 public boolean connectSocket() { boolean result = false; // 开启一个新的线程 startThread(); System.out.print("监听线程开启"); result = true; return result; } // 关闭连接 public void disConnectSocket() { if (rSocket != null) { rSocket.close(); rSocket = null; } if (rPacket != null) { rPacket = null; } // 关闭线程 stopThread(); } // 关闭线程 private void stopThread() { if (rThread != null) { rThread.stop(); rThread = null; } } // 开启新的线程 private void startThread() { if (rThread == null) { rThread = new Thread(this); rThread.start(); } } // 开始发送数据 public void sendData(String sendStr) { try { // 包装数据 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(sendStr); sBuffer = baos.toByteArray(); if (sSocket == null) { sSocket = new DatagramSocket(); } if (sPacket == null) { sPacket = new DatagramPacket(sBuffer, sBuffer.length, InetAddress.getByName(reomteIP), rePort); } sSocket.send(sPacket); sSocket.close(); sSocket = null; sPacket = null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); sSocket.close(); sSocket = null; sPacket = null; System.out.println("senddata error:" + e.getMessage()); } } public void setReomteIP(String reomteIP) { this.reomteIP = reomteIP; } public void setRePort(int rePort) { this.rePort = rePort; } public void setLoPort(int loPort) { // this.loPort = loPort; } }
为什么代码正确,却不能实现UDP之间的通信呢?是不是电脑要设置什么还是怎么的?求大神解决哟.
public class UdpRece { public static void main(String[] args) throws Exception{ //1.定义Socket DatagramSocket ds = new DatagramSocket(10088); //2.创建数据包 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); //3.接受数据 ds.receive(dp); //解析数据 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); int port = dp.getPort(); System.out.println(ip); System.out.println(data); System.out.println(port); ds.close(); } } public class UdpSend { public static void main(String[] args)throws Exception { //1,创建udp服务。通过DatagramSocket对象。 DatagramSocket ds = new DatagramSocket(8888); //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) /*InetAddress ia = InetAddress.getLocalHost(); System.out.println(ia); InetAddress ia1 = InetAddress.getByName("SKY-20170715YUU"); System.out.println(ia1.getHostAddress());*/ byte[] buf = "udp ge men lai le ".getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.0.107.243"),10088); //3,通过socket服务,将已有的数据包发送出去。通过send方法。 ds.send(dp); //4,关闭资源。 ds.close(); } }
java游戏级别的实时性较高的网络通信,如何实现?
我用原生的TCP Socket,会不定时的丢包然后重传导致粘包。用UDP Socket,丢包更严重,几秒就丢一次,数据传输不流畅。怎么破?
请大神帮我看看androi代码,UDP通信是能发,不能收,程序一直卡在收包那个点。怎么解决?
主进程: import android.support.v7.app.ActionBarActivity; import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class YuntuActivity extends ActionBarActivity implements OnClickListener { private TextView adSpeed; private TextView reSpeed; private TextView reTxt; private Button btnHeadCar; private Button btnAgree; private Button btnApply; private Button btnStart; private Button btnExit; //自定义变量 private String remoteIP = null; private int rePort = 0; private int loPort = 0; private UDPThread reTxtThread = null; private UDPThread adSpeedThread = null; private UDPThread reSpeedThread = null; private String sendStr = null;//发送的字符串 private String receStr = null; Handler mhander = new Handler() { public void handleMessage(Message msg) { Bundle bundle =new Bundle(); bundle = msg.getData(); receStr = bundle.getString("info"); reTxt.setText(receStr); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_yuntu); //初始化UI initUI(); //初始化 init(); reTxtThread = new UDPThread(mhander); } private void init() { remoteIP = "172.22.130.124"; rePort = 8801; loPort = 8805; } //初始化UI private void initUI() { adSpeed =(TextView)findViewById(R.id.AdSpeed); reSpeed =(TextView)findViewById(R.id.ReSpeed); reTxt =(TextView)findViewById(R.id.reTxt); btnHeadCar =(Button)findViewById(R.id.button1); btnAgree =(Button)findViewById(R.id.button2); btnApply =(Button)findViewById(R.id.button3); btnStart =(Button)findViewById(R.id.button4); btnExit =(Button)findViewById(R.id.button5); } @Override public void onClick(View v) { switch (v.getId()) { //点击 同意入队 按钮 case R.id.button1: sendStr = "you can join in flownteam."; if(!sendStr.trim().equals("")) { reTxtThread.sendData(sendStr); } break; //点击 申请入队按钮 case R.id.button2: sendStr = "Can I join in?"; if(!sendStr.trim().equals("")) { reTxtThread.sendData(sendStr); } break; //点击申请离队按钮 case R.id.button3: sendStr = "Can I exit?"; if(!sendStr.trim().equals("")) { reTxtThread.sendData(sendStr); } break; //点击开始监听按钮 case R.id.button4: reTxtThread.setReomteIP(remoteIP); reTxtThread.setRePort(rePort); reTxtThread.setLoPort(loPort); boolean connResult = reTxtThread.connectSocket(); if(connResult) { Toast.makeText(getApplicationContext(), "链接建立完毕!", Toast.LENGTH_SHORT).show(); } break; //点击关闭监听按钮 case R.id.button5: reTxtThread.disConnectSocket(); Toast.makeText(getApplicationContext(), "链接已经关闭!", Toast.LENGTH_SHORT).show(); break; default: break; } } } 子线程:发送,接收UDP包 package com.example.cqput_yuntu2; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.text.SimpleDateFormat; import java.util.Date; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.TextView; public class UDPThread implements Runnable { // 定义变量 private TextView rTextView = null; private String reomteIP = null; private int rePort = 0; private int loPort = 0; private Thread rThread = null; private static String CHARECTER = "UTF-8"; private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // 接收 private byte[] rBuffer = new byte[1024]; private DatagramSocket rSocket = null; private DatagramPacket rPacket = null; private String rStr = null; // 发送 private DatagramSocket sSocket = null; private DatagramPacket sPacket = null; private byte[] sBuffer = new byte[1024]; public Handler mhandler; public UDPThread(Handler handler) { mhandler = handler; } @Override public void run() { // 开始接收数据 Looper.prepare(); if (Thread.currentThread() == rThread) { System.out.println("------jieshouqian"); rStr = receiveData(); System.out.println("------jieshouhou"); Message toMain = mhandler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("info", rStr); toMain.setData(bundle); mhandler.sendMessage(toMain); } ; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 开始接收数据 private String receiveData() { try { ByteArrayInputStream bais = new ByteArrayInputStream(rBuffer); DataInputStream dis = new DataInputStream(bais); if (rSocket == null) { rSocket = new DatagramSocket(8805); } if (rPacket == null) { rPacket = new DatagramPacket(rBuffer, rBuffer.length); } System.out.println("----rece"); rSocket.receive(rPacket); System.out.println("------receHou"); rStr = dis.readUTF().trim(); System.out.println("------jieBeg"); rStr = String.format("[%s:%d//%s]%s", rPacket.getAddress() .getHostAddress(), rPacket.getPort(), sdf .format(new Date()), rStr); return rStr; } catch (Exception e) { e.printStackTrace(); System.out.println("-----------------recvdata error:" + e.getMessage()); } return null; } // 建立连接 public boolean connectSocket() { boolean result = false; // 开启一个新的线程 startThread(); System.out.print("监听线程开启"); result = true; return result; } // 关闭连接 public void disConnectSocket() { if (rSocket != null) { rSocket.close(); rSocket = null; } if (rPacket != null) { rPacket = null; } // 关闭线程 stopThread(); } // 关闭线程 private void stopThread() { if (rThread != null) { rThread.stop(); rThread = null; } } // 开启新的线程 private void startThread() { if (rThread == null) { rThread = new Thread(this); rThread.start(); } } // 开始发送数据 public void sendData(String sendStr) { try { // 包装数据 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(sendStr); sBuffer = baos.toByteArray(); if (sSocket == null) { sSocket = new DatagramSocket(); } if (sPacket == null) { sPacket = new DatagramPacket(sBuffer, sBuffer.length, InetAddress.getByName(reomteIP), rePort); } sSocket.send(sPacket); sSocket.close(); sSocket = null; sPacket = null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); sSocket.close(); sSocket = null; sPacket = null; System.out.println("senddata error:" + e.getMessage()); } } public void setReomteIP(String reomteIP) { this.reomteIP = reomteIP; } public void setRePort(int rePort) { this.rePort = rePort; } public void setLoPort(int loPort) { // this.loPort = loPort; } }
请大神看看android socket通信代码,发送没问题,接收UDP包时一直卡在receive。
import android.support.v7.app.ActionBarActivity; import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class YuntuActivity extends ActionBarActivity implements OnClickListener { private TextView adSpeed; private TextView reSpeed; private TextView reTxt; private Button btnHeadCar; private Button btnAgree; private Button btnApply; private Button btnStart; private Button btnExit; //自定义变量 private String remoteIP = null; private int rePort = 0; private int loPort = 0; private UDPThread reTxtThread = null; private UDPThread adSpeedThread = null; private UDPThread reSpeedThread = null; private String sendStr = null;//发送的字符串 private String receStr = null; Handler mhander = new Handler() { public void handleMessage(Message msg) { Bundle bundle =new Bundle(); bundle = msg.getData(); receStr = bundle.getString("info"); reTxt.setText(receStr); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_yuntu); //初始化UI initUI(); //初始化 init(); reTxtThread = new UDPThread(mhander); } private void init() { remoteIP = "172.22.130.124"; rePort = 8801; loPort = 8805; } //初始化UI private void initUI() { adSpeed =(TextView)findViewById(R.id.AdSpeed); reSpeed =(TextView)findViewById(R.id.ReSpeed); reTxt =(TextView)findViewById(R.id.reTxt); btnHeadCar =(Button)findViewById(R.id.button1); btnAgree =(Button)findViewById(R.id.button2); btnApply =(Button)findViewById(R.id.button3); btnStart =(Button)findViewById(R.id.button4); btnExit =(Button)findViewById(R.id.button5); } @Override public void onClick(View v) { switch (v.getId()) { //点击 同意入队 按钮 case R.id.button1: sendStr = "you can join in flownteam."; if(!sendStr.trim().equals("")) { reTxtThread.sendData(sendStr); } break; //点击 申请入队按钮 case R.id.button2: sendStr = "Can I join in?"; if(!sendStr.trim().equals("")) { reTxtThread.sendData(sendStr); } break; //点击申请离队按钮 case R.id.button3: sendStr = "Can I exit?"; if(!sendStr.trim().equals("")) { reTxtThread.sendData(sendStr); } break; //点击开始监听按钮 case R.id.button4: reTxtThread.setReomteIP(remoteIP); reTxtThread.setRePort(rePort); reTxtThread.setLoPort(loPort); boolean connResult = reTxtThread.connectSocket(); if(connResult) { Toast.makeText(getApplicationContext(), "链接建立完毕!", Toast.LENGTH_SHORT).show(); } break; //点击关闭监听按钮 case R.id.button5: reTxtThread.disConnectSocket(); Toast.makeText(getApplicationContext(), "链接已经关闭!", Toast.LENGTH_SHORT).show(); break; default: break; } } } 子线程: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.text.SimpleDateFormat; import java.util.Date; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.TextView; public class UDPThread implements Runnable { // 定义变量 private TextView rTextView = null; private String reomteIP = null; private int rePort = 0; private int loPort = 0; private Thread rThread = null; private static String CHARECTER = "UTF-8"; private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // 接收 private byte[] rBuffer = new byte[1024]; private DatagramSocket rSocket = null; private DatagramPacket rPacket = null; private String rStr = null; // 发送 private DatagramSocket sSocket = null; private DatagramPacket sPacket = null; private byte[] sBuffer = new byte[1024]; public Handler mhandler; public UDPThread(Handler handler) { mhandler = handler; } @Override public void run() { // 开始接收数据 Looper.prepare(); if (Thread.currentThread() == rThread) { System.out.println("------jieshouqian"); rStr = receiveData(); System.out.println("------jieshouhou"); Message toMain = mhandler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("info", rStr); toMain.setData(bundle); mhandler.sendMessage(toMain); } ; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 开始接收数据 private String receiveData() { try { ByteArrayInputStream bais = new ByteArrayInputStream(rBuffer); DataInputStream dis = new DataInputStream(bais); if (rSocket == null) { rSocket = new DatagramSocket(8805); } if (rPacket == null) { rPacket = new DatagramPacket(rBuffer, rBuffer.length); } System.out.println("----rece"); rSocket.receive(rPacket); System.out.println("------receHou"); rStr = dis.readUTF().trim(); System.out.println("------jieBeg"); rStr = String.format("[%s:%d//%s]%s", rPacket.getAddress() .getHostAddress(), rPacket.getPort(), sdf .format(new Date()), rStr); return rStr; } catch (Exception e) { e.printStackTrace(); System.out.println("-----------------recvdata error:" + e.getMessage()); } return null; } // 建立连接 public boolean connectSocket() { boolean result = false; // 开启一个新的线程 startThread(); System.out.print("监听线程开启"); result = true; return result; } // 关闭连接 public void disConnectSocket() { if (rSocket != null) { rSocket.close(); rSocket = null; } if (rPacket != null) { rPacket = null; } // 关闭线程 stopThread(); } // 关闭线程 private void stopThread() { if (rThread != null) { rThread.stop(); rThread = null; } } // 开启新的线程 private void startThread() { if (rThread == null) { rThread = new Thread(this); rThread.start(); } } // 开始发送数据 public void sendData(String sendStr) { try { // 包装数据 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(sendStr); sBuffer = baos.toByteArray(); if (sSocket == null) { sSocket = new DatagramSocket(); } if (sPacket == null) { sPacket = new DatagramPacket(sBuffer, sBuffer.length, InetAddress.getByName(reomteIP), rePort); } sSocket.send(sPacket); sSocket.close(); sSocket = null; sPacket = null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); sSocket.close(); sSocket = null; sPacket = null; System.out.println("senddata error:" + e.getMessage()); } } public void setReomteIP(String reomteIP) { this.reomteIP = reomteIP; } public void setRePort(int rePort) { this.rePort = rePort; } public void setLoPort(int loPort) { this.loPort = loPort; } }
java中,socket拿到字符串如何处理问题!
UDP通信之后拿到字符串,我要对他进行截取处理! byte[] inBuf=new byte[1024]; DatagramPacket inPacket=new DatagramPacket(inBuf,inBuf.length); socket.receive(inPacket); receiveInfo= new String(inPacket.getData()); 我要写一个方法字符串截取 private String stringTopoint(String str,int len){ String ret = ""; StringBuilder sb = new StringBuilder(); for(int i=0;i<len;i++){ ret=sb.substring(3, 6); } return ret; }但是我拿到数据是字节的,我又要对字符串处理,我要怎么调用我写的方法呢?求大神赐教
java报文解析!求大神指导!
大家帮我解析一下报文吧!我用的是UDP通信拿到数据,数据的类型是这样的S5W1449!p1r!p1r003B1s!S6WGGG00!p2r!p2r00003!p1r!p1r003B1s! 第0~2位为p1r或p2r,第3~6位为对应侧(p1r或p2r)的点位,第7位为状态位第8位为CRC校验位(将以上待发送的8位 异或)第9位为!结束位。 比如p1r!p1r003B1s!,我要拿到点位003B,要把它转化成十进制显示在我的界面画图!我要怎么解析报文!能写出具体函数最好,新人求解析!通信我已经做好了!
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
C语言荣获2019年度最佳编程语言
关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang近日,TIOBE官方发布了2020年1月编程语言排行榜单。我在前面给过一篇文章《2019年11月C语言接近Ja...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
一份王者荣耀的英雄数据报告
咪哥杂谈本篇阅读时间约为 6 分钟。1前言前一阵写了关于王者的一些系列文章,从数据的获取到数据清洗,数据落地,都是为了本篇的铺垫。今天来实现一下,看看不同维度得到的结论。2环境准备本次实...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
立即提问