socket通讯:C语言作为客户端Java作为服务端,java能收到请求报文,C接收不到响应报文。

风流张郎 2016-04-07 05:50:47
我完全不懂C语言,从C那边拿到客户端的代码,代码如下:
C连接服务端说是在iConnect方法中

/* 连接到服务器 */
static int iConnect(int *pSock)
{
struct sockaddr_in stSin;
int iSock;
int iRet;

memset(&stSin, 0, sizeof(stSin));
stSin.sin_family = AF_INET;
stSin.sin_port = htons(stCommInfo.Port);
if((iRet = inet_pton(AF_INET, stCommInfo.Ip, &stSin.sin_addr)) < 0)
{
log_error("转换地址失败:%s", strerror(errno));
return -1;
}
else if(iRet == 0)
{
log_error("无效的地址:%s", stCommInfo.Ip);
return -1;
}

iSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(iSock < 0) {
log_error("创建连接套接字失败:%s", strerror(errno));
return -1;
}

if(fcntl(iSock, F_SETFL, O_NONBLOCK) < 0)
{
log_error("设置非阻塞套接字失败:%s", strerror(errno));
return -1;
}

if(connect(iSock, (struct sockaddr *)&stSin, sizeof(struct sockaddr)) == -1)
{
if(errno != EINPROGRESS)
{
log_error("创建连接套接字失败:%s", strerror(errno));
return -1;
}
}

*pSock = iSock;
return 0;
}

static int iNRead(int iFd, char *sBuffer, int iLen)
{
int i, iRc, iReadLen = 0;
struct timeval tv = {0, 10000};

for(i = 0; i < 3; i++)
{
if((iRc = read(iFd, sBuffer + iReadLen, iLen - iReadLen)) > 0)
{
iReadLen += iRc;
if(iReadLen == iLen)
return iReadLen;
}
else if(iRc == 0)
{
log_error("文件描述符[%d]被关闭", iFd);
return 0;
}
else
{
if(errno == EAGAIN || errno == EWOULDBLOCK)
select(0, NULL, NULL, NULL, &tv);
else if(errno == EINTR)
continue;
else
{
log_error("读取数据失败:%s, 文件描述符[%d]",
strerror(errno), iFd);
return -1;
}
}
}

log_error("数据不完整, 文件描述符[%d]", iFd);

return -1;
}


java这边代码如下
线程


@Service("faceSSocketService")
public class FaceSSocketService {

// socket server 线程
private SocketThread socketThread;

@Resource(name="faceWebServiceimpl")
FaceWebService faceWebServiceimpl;

public FaceWebService getFaceWebServiceImpl(){
return this.faceWebServiceimpl;
}


public void close() {

if (null != socketThread && !socketThread.isInterrupted()) {
socketThread.closeSocketServer();
socketThread.interrupt();
}

}


public void start() {

int serverPort = ObjectUtils.objToInt(
PropsUtil.getProperty("ibis.socket.port"), -1);
if (null == socketThread) {
// 新建线程类
socketThread = new SocketThread(null, this.getFaceWebServiceImpl(),
ObjectUtils.objToInt(serverPort, 8082));
// 启动线程
socketThread.start();
}

}

}

socket服务


/**
* 多线程处理socket接收的数据
* socket在com.grgbanking.wxyh.listener.SocketThread.java中启动
*/
public class SocketServer extends Thread {

private static final Logger logger = Logger.getLogger(SocketServer.class);

private Socket socket;
private FaceWebService faceWebService;

public SocketServer(Socket socket, FaceWebService faceWebService) {
this.socket = socket;
this.faceWebService = faceWebService;
}

public void run() {
DataInputStream inputStream = null;
DataOutputStream outputStream=null;
Connection conn=null;
PreparedStatement ps=null;
try {
outputStream = new DataOutputStream(socket.getOutputStream());
inputStream = new DataInputStream(socket.getInputStream());
// PrintWriter outWriter=new PrintWriter(outputStream);
String requestXmlStr = "";
byte[] buf=new byte[4096];
int length =0;
while((length = inputStream.read(buf))!=-1){
byte[] tmp=new byte[length];
System.arraycopy(buf, 0, tmp, 0, length);
requestXmlStr += new String(tmp,"GBK");
}
logger.info("接收到前置发过来的报文为:" + requestXmlStr);

String responseXmlStr = SocketServerBusiness.doBusiness(faceWebService,requestXmlStr);
// outWriter.println(responseXmlStr);
// outWriter.flush();
byte[] ss = responseXmlStr.getBytes("GBK");
outputStream.write(ss);
outputStream.flush();
// logger.info("返回给前置的消息:" + responseLength+responseXmlStr);
} catch (UnsupportedEncodingException e) {
logger.error("UnsupportedEncodingException",e);
} catch (IOException e) {
logger.error("IOException",e);
} catch (Exception e) {
logger.error("Exception",e);
}finally{
try {
outputStream.close();
inputStream.close();
socket.close();
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
} catch (IOException e) {
logger.error("IOException",e);
} catch (SQLException e) {
logger.error("IOException",e);
}
}
}
}

doBusiness其中处理业务的就不用管了,总之现在返回responseXmlStr ,C客户端收不到数据,请各位搞人指点!
...全文
483 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljc930611 2016-08-11
  • 打赏
  • 举报
回复
同求,我这边也有这个问题,楼主怎么解决的
renwotao2009 2016-04-07
  • 打赏
  • 举报
回复
用wireshark抓包看有没有回复包,调试下

50,541

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧