(1)网络不通,关闭了广播端口;
(2)发送广播的程序使用了不同的端口,导致无法接收;
(3)计算机上有软件防火墙,关闭了接收程序的相关端口;
(4)防火墙策略没有将网络报文中的IP地址白名单放进去;
(5)目的地的程序未正确接收广播报文,导致报文丢失。
为此,需要对网络进行检查,检查广播端口是否被关闭,检查防火墙是否阻止了接收程序的相关端口,确保计算机上的防火墙策略中有放入网络报文中的IP地址白名单,最后确保目的地程序能够正确接收广播报文,以保证能够成功接收到socket广播。
这是一个发送多播帧的例子:#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <resolv.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#define SERV_PORT 5000
int main(int,char**)
{
int SendtoSocket
sockaddr_in SendtoAddr
int AddrLen=sizeof(SendtoAddr)
char szBuffer[200]="This is a test\n"
char *szTime
SendtoSocket=socket(AF_INET,SOCK_DGRAM,0)
bzero(&SendtoAddr,sizeof(SendtoAddr))
SendtoAddr.sin_family=AF_INET
SendtoAddr.sin_port=htons(SERV_PORT)
inet_pton(AF_INET,"224.0.3.1",&SendtoAddr.sin_addr)
const int on=1
// setsockopt(SendtoSocket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on))
time_t CurrentTime
for()
{
time(&CurrentTime)
szTime=ctime(&CurrentTime)
sendto(SendtoSocket,szTime,strlen(szTime),0,(sockaddr *)&SendtoAddr,AddrLe
n)
sleep(1)
}
}
这是接收多播帧的例子:
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <resolv.h>
#include <string.h>
#include <unistd.h>
#define SERV_PORT 5000
int main(int,char**)
{
int RecvSocket
sockaddr_in ServAddr
socklen_t AddrLen=sizeof(ServAddr)
char szBuffer[201]
RecvSocket=socket(AF_INET,SOCK_DGRAM,0)
bzero(&ServAddr,sizeof(ServAddr))
ServAddr.sin_family=AF_INET
ServAddr.sin_addr.s_addr=htonl(INADDR_ANY)
ServAddr.sin_port=htons(SERV_PORT)
bind(RecvSocket,(sockaddr *)&ServAddr,AddrLen)
ip_mreq mreq
inet_pton(AF_INET,"224.0.3.1",&mreq.imr_multiaddr.s_addr)
mreq.imr_interface.s_addr=ServAddr.sin_addr.s_addr
setsockopt(RecvSocket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))
int nRecv
for()
{
nRecv=recvfrom(RecvSocket,szBuffer,200,0,(sockaddr *)&ServAddr,&AddrLen)
szBuffer[nRecv]='\0'
printf(szBuffer)
}
}
根据你的改了个!不好意思,其中读写的思路稍微有点不同!不过可以做参考!Server端代码:
import java.net.*
import java.io.*
import java.util.*
public class TestServer {
ServerSocket s = null
boolean started = false//用来监听服务器是否启动!
List<ServerReaderWriter>clients = new ArrayList<ServerReaderWriter>()//用来存放启动的客服端
public static void main(String[] args) {
new TestServer().start()
}
public void start() {
try {
s = new ServerSocket(5050)
started = true
} catch(SocketException e) {
System.out.println("5050端口正在使用中!!!请关掉相关程序并重新运行服务器!")
System.exit(0)
} catch (IOException e) {
e.printStackTrace()
}
int i = 1
try {
while(started) {
Socket ss = s.accept()
ServerReaderWriter c = new ServerReaderWriter(ss)//建立客服端
System.out.println("第" + i + "个客服端启动!")
++i
new Thread(c).start()//启动线程
clients.add(c)
}
} catch (EOFException e) {
System.out.println("客服端被关闭!")
} catch (IOException e) {
e.printStackTrace()
} finally {
try {
s.close()
} catch (IOException e) {
e.printStackTrace()
}
}
}
class ServerReaderWriter implements Runnable { //建议使用Runnable避免你重写run方法麻烦!
private Socket s
private DataInputStream dis = null//注意赋值,养成好习惯!
private DataOutputStream dos = null
private boolean bConnected = false//用于调用连接成功后的run方法
public ServerReaderWriter(Socket s) {
this.s = s
try {
dis = new DataInputStream(s.getInputStream())
dos = new DataOutputStream(s.getOutputStream())
bConnected = true
} catch (IOException e) {
e.printStackTrace()
}
}
public void send(String str) {
try {
dos.writeUTF(str)
} catch (IOException e) {
clients.remove(this)
System.out.println("有客户退出!")
}
}
public void run() {
try {
while (bConnected) {
String input = dis.readUTF()
System.out.println(input)
for(int i=0i<clients.size()++i) {
ServerReaderWriter c = clients.get(i)
c.send(input)
}
}
} catch(SocketException e) {
System.out.println("一个客服端已关闭,请勿再像他发送信息!")
} catch (EOFException e) {
System.out.println("谢谢使用!")
}catch (IOException e) {
e.printStackTrace()
} finally {
try {
if (dis != null) {
dis.close()
}
if (dos != null) {
dos.close()
}
if (s != null) {
s.close()
s = null
}
//clients.clear()
} catch (IOException e1) {
e1.printStackTrace()
}
}
}
}
}
Client端代码:
import java.io.*
import java.net.*
import java.awt.*
import java.awt.event.*
public class TestClient extends Frame { //用到Frame生产界面比较直观
Socket s = null
DataOutputStream dos = null
DataInputStream dis = null
private boolean bConnected = false
TextField tfText = new TextField()
TextArea taContent = new TextArea()
Thread tRecv = new Thread(new ClientReaderWriter())
public static void main(String[] args){
new TestClient().launchFrame()
}
public void launchFrame() {
this.setSize(300, 300)//设置客服端窗口格式
this.setLocation(400, 300)
add(tfText, BorderLayout.SOUTH)
add(taContent, BorderLayout.NORTH)
this.pack()
this.addWindowListener(new WindowAdapter() { //监听窗口关闭事件
public void windowClosing(WindowEvent arg0) {
disconnect()
System.exit(0)
}
})
tfText.addActionListener(new TFListener())
setVisible(true)
connect()
tRecv.start()
}
public void connect() {
try {
s = new Socket("127.0.0.1", 5050)//依据自己的服务器,我这里用的localhost
dos = new DataOutputStream(s.getOutputStream())
dis = new DataInputStream(s.getInputStream())
System.out.println("连接服务器!")
bConnected = true
} catch(ConnectException e) {
System.out.println("请检查服务器是否启动!")
try {
Thread.sleep(1000)
} catch (InterruptedException e1) {
e1.printStackTrace()
}
System.exit(0)
}
catch (UnknownHostException e) {
e.printStackTrace()
} catch (IOException e) {
e.printStackTrace()
}
}
public void disconnect() {
try {
dos.close()
dis.close()
s.close()
} catch (IOException e) {
e.printStackTrace()
}
}
private class TFListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String str = tfText.getText().trim()
tfText.setText("")
try {
dos.writeUTF(str)
if(str.equals("bye")){
System.exit(0)
}
dos.flush()
} catch (IOException e1) {
e1.printStackTrace()
}
}
}
class ClientReaderWriter implements Runnable {
public void run() {
try {
while(bConnected) {
String input = dis.readUTF()
taContent.setText(taContent.getText() + input +'\n')
}
} catch (SocketException e) {
System.out.println("轻轻的我走了!Bye-bye!")
} catch (EOFException e) {
System.out.println("我断网了,再见!")
}
catch (IOException e) {
e.printStackTrace()
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)