java服务端,iosjava 客户端 服务端怎么用tcp连接

主题 : ios socket与javasocket通信问题
级别: 新手上路
可可豆: 106 CB
威望: 106 点
在线时间: 57(时)
发自: Web Page
ios socket与javasocket通信问题&&&
技术问题发到问答:我知道,我仍旧要在论坛继续发布问题
请问有人用过AsyncSocket(客户端)与java socket(服务器端)通信吗?我遇到这情况,服务器端收不到客户端的信息,客户端也收不到服务器返回的信息但是客户端与服务器端的socket连接却是创建了,这问题是出在哪里呢实在是弄不通了,请大神指教!!ios客户端代码
//&&TestUdpClientAppDelegate.m
//&&TestUdpClient
//&&Created by Xie Wei on 11-6-5.
//&&Copyright 2011年 . All rights reserved.
#import &TestTcpClientAppDelegate.h&
#import &AsyncUdpSocket.h&
#import &AsyncSocket.h&
#define SERVER_IP&&&&@&192.168.1.109&
//#define SERVER_IP&&&&@&127.0.0.1&
#define SERVER_PORT&&3005
@implementation TestUdpClientAppDelegate
@synthesize window = _
@synthesize sendSocket = _sendS
//发送短消息
-(IBAction)sendString
&&&&NSData *data = [NSData dataWithBytes:&This is a test\n& length:15];
&&&&static BOOL connectOK = NO;
&&&&if (!_sendSocket)
&&&&&&&&self.sendSocket = [[[AsyncSocket alloc] initWithDelegate: self] autorelease];
&&&&&&&&NSError *
&&&&&&&&connectOK = [_sendSocket connectToHost: SERVER_IP onPort: SERVER_PORT error: &error];
&&&&&&&&if (!connectOK)
&&&&&&&&&&&&NSLog(@&connect error: %@&, error);
&&&&&&&&}else{
&&&&&&&&&&&&NSLog(@&connect succ&);
&&&&&&&&[_sendSocket setRunLoopModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
&&&&if (connectOK)
&&&&&&&&[_sendSocket writeData: data withTimeout: -1 tag: 0];
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
&&&&float button_center_y = 20;
&&&&float button_center_offset = 50;
&&&&_sendButton = [UIButton buttonWithType: UIButtonTypeRoundedRect];
&&&&_sendButton.frame = CGRectMake(0, 0, 200, 30);
&&&&_sendButton.center = CGPointMake(320 / 2, button_center_y += button_center_offset);
&&&&[_sendButton addTarget: self action: @selector(sendString) forControlEvents: UIControlEventTouchUpInside];
&&&&[_sendButton setTitle: @&Send String& forState: UIControlStateNormal];
&&&&[self.window addSubview: _sendButton];
&&&&[self.window makeKeyAndVisible];
&&&&return YES;
#pragma mark - tcp
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
&&&&NSLog(@&%s %d&, __FUNCTION__, __LINE__);
&&&&[_sendSocket readDataWithTimeout: -1 tag: 0];
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag
&&&&NSLog(@&%s %d, tag = %ld&, __FUNCTION__, __LINE__, tag);
&&&&[_sendSocket readDataWithTimeout: -1 tag: 0];
// 这里必须要使用流式数据
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
&&&&NSString *msg = [[[NSString alloc] initWithData: data encoding:NSUTF8StringEncoding] autorelease];
&&&&NSLog(@&%s %d, msg = %@&, __FUNCTION__, __LINE__, msg);
&&&&[_sendSocket readDataWithTimeout: -1 tag: 0];
- (void)onSocketDidDisconnect:(AsyncSocket *)sock
&&&&NSLog(@&%s %d&, __FUNCTION__, __LINE__);
&&&&self.sendSocket =
#pragma mark -
- (void)dealloc
&&&&[_window release];
&&&&[super dealloc];
java服务器端代码
package com.dvn.li.
import java.net.InetSocketA
import java.nio.charset.C
import org.apache.log4j.L
import org.mon.IdleS
import org.mon.IoA
import org.apache.mina.filter.codec.ProtocolCodecF
import org.apache.mina.filter.codec.textline.LineD
import org.apache.mina.filter.codec.textline.TextLineCodecF
import org.apache.mina.transport.socket.nio.NioSocketA
import com.dvn.li.handler.Demo1ServerH
public class MinaServer01 {
&&&&private static Logger logger = Logger.getLogger(MinaServer01.class);
&&&&private static int PORT = 3005;
&&&&public static void main(String[] args) {
&&&&&&&&IoAcceptor acceptor =
&&&&&&&&try {
&&&&&&&&&&&&// 创建一个非阻塞的server端的Socket
&&&&&&&&&&&&acceptor = new NioSocketAcceptor();
&&&&&&&&&&&&// 设置过滤器(使用Mina提供的文本换行符编解码器)
&&&&&&&&&&&&acceptor.getFilterChain().addLast(
&&&&&&&&&&&&&&&&&&&&&codec&,
&&&&&&&&&&&&&&&&&&&&new ProtocolCodecFilter(new TextLineCodecFactory(Charset
&&&&&&&&&&&&&&&&&&&&&&&&&&&&.forName(&UTF-8&), LineDelimiter.WINDOWS.getValue(),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&LineDelimiter.WINDOWS.getValue())));
&&&&&&&&&&&&// 设置读取数据的缓冲区大小
&&&&&&&&&&&&acceptor.getSessionConfig().setReadBufferSize(2048);
&&&&&&&&&&&&// 读写通道10秒内无操作进入空闲状态
&&&&&&&&&&&&acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
&&&&&&&&&&&&// 绑定逻辑处理器
&&&&&&&&&&&&acceptor.setHandler(new Demo1ServerHandler());
&&&&&&&&&&&&// 绑定端口
&&&&&&&&&&&&acceptor.bind(new InetSocketAddress(PORT));
&&&&&&&&&&&&(&服务端启动成功...&&&& 端口号为:& + PORT);
&&&&&&&&} catch (Exception e) {
&&&&&&&&&&&&logger.error(&服务端启动异常....&, e);
&&&&&&&&&&&&e.printStackTrace();
package com.dvn.li.
import java.util.D
import org.apache.log4j.L
import org.mon.IdleS
import org.mon.IoHandlerA
import org.mon.IoS
public class Demo1ServerHandler extends IoHandlerAdapter {
&&&&public static Logger logger = Logger.getLogger(Demo1ServerHandler.class);
&&&&@Override
&&&&public void sessionCreated(IoSession session) throws Exception {
&&&&&&&&(&服务端111与客户端创建连接...&);
&&&&&&&&//System.out.println(&服务端111与客户端创建连接...&);
&&&&@Override
&&&&public void sessionOpened(IoSession session) throws Exception {
&&&&&&&&(&服务端111与客户端连接打开...&);
&&&&&&&&//System.out.println(&服务端111与客户端连接打开...&);
&&&&@Override
&&&&public void messageReceived(IoSession session, Object message)
&&&&&&&&&&&&throws Exception {
&&&&&&&&System.out.println(&messageReceived&);
&&&&&&&&String msg = message.toString();
&&&&&&&&System.out.println(&服务端111接收到的数据为:& + msg);
&&&&&&&&(&服务端111接收到的数据为:& + msg);
&&&&&&&&if (&bye&.equals(msg)) { // 服务端断开连接的条件
&&&&&&&&&&&&session.close();
&&&&&&&&Date date = new Date();
&&&&&&&&session.write(&1234567&);
&&&&&&&& //Thread.sleep(10000);
&&&&@Override
&&&&public void messageSent(IoSession session, Object message) throws Exception {
&&&&&&&&session.close();
&&&&&&&&(&服务端111发送信息成功...&);
&&&&&&&&//System.out.println(&服务端111发送信息成功...&);
&&&&@Override
&&&&public void sessionClosed(IoSession session) throws Exception {
&&&&@Override
&&&&public void sessionIdle(IoSession session, IdleStatus status)
&&&&&&&&&&&&throws Exception {
&&&&&&&&(&服务端111进入空闲状态...&);
&&&&&&&&//System.out.println(&服务端111进入空闲状态...&);
&&&&@Override
&&&&public void exceptionCaught(IoSession session, Throwable cause)
&&&&&&&&&&&&throws Exception {
&&&&&&&&logger.error(&服务端111发送异常...&, cause);
&&&&&&&&//System.out.println(&服务端111发送异常...&);
级别: 新手上路
可可豆: 106 CB
威望: 106 点
在线时间: 57(时)
发自: Web Page
是不是网络字节序的问题呢,是的话又该怎么改呢在网上没有找到改网络字节序的方案
级别: 精灵王
发帖: 1517
可可豆: 5147 CB
威望: 5418 点
在线时间: 1050(时)
发自: Web Page
网络字节序应该要装换,就是大小端的问题, ntohl&& htonl看看我怀疑你server端的代码有点问题,java我不是很熟悉就是了,bsd socket连接和接收数据是用不同的port,你这里只有1个。 而且因为是tcp socket,你的server端有绑定和监听吗?至少上面的代码我没看到。
级别: 新手上路
可可豆: 106 CB
威望: 106 点
在线时间: 57(时)
发自: Web Page
回 2楼(xiaochengfei) 的帖子
呵呵谢谢,我后来使用c语言实现socket就可以与服务器通信了
级别: 新手上路
可可豆: 106 CB
威望: 106 点
在线时间: 57(时)
发自: Web Page
我实现的demo在这里,留给有需要的同志
级别: 精灵王
可可豆: 4004 CB
威望: 4004 点
在线时间: 624(时)
发自: Web Page
mark mark mark mark
级别: 骑士
UID: 13285
可可豆: 1266 CB
威望: 1325 点
在线时间: 1648(时)
发自: Web Page
关注本帖(如果有新回复会站内信通知您)
9*6-8 正确答案:46
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版java基础(41)
网络相关(1)
在正式进入网络编程之前先简单介绍一个网络编程的基本概念。
网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换即可以理解为一次网络通讯过程。在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。
由此,网络编程中的两种程序就分别是客户端和服务器端,例如QQ程序,每个QQ用户安装的都是QQ客户端程序,而QQ服务器端程序则运行在腾讯公司的机房中,为大量的QQ用户提供服务。这种网络编程的结构被称作客户端/服务器结构,也叫做Client/Server结构,简称C/S结构。而一般如J2EE等web开发,则是浏览器/服务器,简称B/S结构。
使用B/S结构的程序,在开发时只需要开发服务器端即可,这种结构的优势在于开发的压力比较小,不需要维护客户端。但是这种结构也存在着很多不足,例如浏览器的限制比较大,表现力不强,无法进行系统级操作等。
总之C/S结构和B/S结构是现在网络编程中常见的两种结构,B/S结构其实也就是一种特殊的C/S结构。
使用B/S结构的程序,在开发时只需要开发服务器端即可,这种结构的优势在于开发的压力比较小,不需要维护客户端。但是这种结构也存在着很多不足,例如浏览器的限制比较大,表现力不强,无法进行系统级操作等。
总之C/S结构和B/S结构是现在网络编程中常见的两种结构,B/S结构其实也就是一种特殊的C/S结构。
最后再介绍一个网络编程中最重要,也是最复杂的概念——协议(Protocol)。按照前面的介绍,网络编程就是运行在不同计算机中两个程序之间的数据交换。在实际进行数据交换时,为了让接收端理解该数据,计算机比较笨,什么都不懂的,那么就需要规定该数据的格式,这个数据的格式就是协议。
那么如何来编写协议格式呢?答案是随意。只要按照这种协议格式能够生成唯一的编码,按照该编码可以唯一的解析出发送数据的内容即可。也正因为各个网络程序之间协议格式的不同,所以才导致了客户端程序都是专用的结构。
在实际的网络程序编程中,最麻烦的内容不是数据的发送和接收,因为这个功能在几乎所有的程序语言中都提供了封装好的API进行调用,最麻烦的内容就是协议的设计以及协议的生产和解析,这个才是网络编程中最核心的内容。
在现有的网络中,网络通讯的方式主要有两种:
1、 TCP(传输控制协议)方式
2、 UDP(用户数据报协议)方式
关于这两个协议的区别这里不过多介绍。这里我们采用TCP来进行传输。
在客户端网络编程中,首先需要建立连接,在Java API中以java.net.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,该对象代表网络连接,示例如下:
Socket socket1 = new Socket(“192.168.1.103”,10000);
Socket socket2 = new Socket(“”,80);
注:Socket的参数一表示服务器ip地址或者域名或者主机名。(写主机名获取域名最后都被解析为ip地址),参数二表示端口号。
连接一旦建立,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下:
OutputStream os = socket1.getOutputStream();
InputStream is = socket1.getInputStream();
最后当数据交换完成以后,关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作,示例代码如下:
socket1.close();
现在我们编写一个完整客户段的Demo来向服务器发送字符串 “Hello World”
public class SocketClient {
public static void main(String[] args) {
Socket socket = new Socket("192.168.1.8",8888);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello,world".getBytes());
outputStream.close();
socket.close();
}catch(Exception e){
e.printStackTrace();
服务端的Demo:
public class SocketService {
public static void main(String[] args) {
InputStream inputS
StringBuilder s = new StringBuilder();
ServerSocket serviceSocket = new ServerSocket(8888);
socket = serviceSocket.accept();
inputStream = socket.getInputStream();
byte buf[] = new byte[1024];
int len = 0;
while((len=(inputStream.read(buf)))&0){
s.append(new String(buf,0,len));
System.out.println(s.toString());
} catch (IOException e) {
e.printStackTrace();
先运行服务端的Demo,在运行客户端的。即可看到在服务端接受到了客户端传递过来的字符串HelloWorld.
服务端接受到客户端的信息后,向客户端回应一句话:
public class SocketClient {
public static void main(String[] args) {
Socket socket =null;
InputStream inputStream =null;
OutputStream outputStream =null;
socket = new Socket("hadoop",10000);
outputStream =
socket.getOutputStream();
outputStream.write("hello world:".getBytes());
获取输入流,获取服务器的响应
inputStream = socket.getInputStream();
byte[] buff = new byte[1024];
int len = 0;
inputStream.read(buff);
System.out.println(new String(buff,0,len));
}catch(Exception e){
e.printStackTrace();
}finally {
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
public class SocketService {
public static void main(String[] args) {
InputStream inputStream =null;
OutputStream outputStream =null;
Socket socket = null;
ServerSocket serviceSocket =null;
serviceSocket = new ServerSocket(10000);
socket = serviceSocket.accept();
inputStream = socket.getInputStream();
byte buf[] = new byte[1024];
int len = 0;
len =inputStream.read(buf);
System.out.println(new String(buf,0,len));
outputStream = socket.getOutputStream();
outputStream.write("收到".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
outputStream.close();
inputStream.close();
socket.close();
serviceSocket.close();
} catch (IOException e) {
e.printStackTrace();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:38945次
积分:1543
积分:1543
排名:第18623名
原创:112篇
阅读:1477
(1)(5)(6)(11)(23)(15)(19)(28)(14)JAVA serverSocket连接多个客户端,并且能让客户端之间相互通信,类似于聊天室一样代码如下:服务端内容:import java.net.*;import java.io.*;public class Tcpserver extends Thread{private static Spublic void run(){try{//输入数据的读取BufferedReader br__KEY_in = new BufferedReader(new InputStreamReader(System.in));PrintWriter pw = new PrintWriter(skt.getOutputStream());// 写入数据while(true){pw.println(br__KEY_in.readLine()); //读取一个文本行pw.flush(); / 刷新该流的缓冲}}catch(Exception e){e.printStackTrace();} }public static void main(String[] args) throws Exception{ServerSocket server = new ServerSocket(7777); // 定义服务器端套接字skt = server.accept(); // 使server进入等待呼叫的状态(侦听)注意是阻塞式..System.out.println("server 连接成功!"); //解除阻塞,完成Socket连接new Tcpserver().start(); //启动线程BufferedReader br _in= new BufferedReader(new InputStreamReader(skt.getInputStream()));while(true){ //从输入流不断的读数据,直到读完为止System.out.println(br_in.readLine()); }}}能帮我解决这个问题的,追加100分
本吧wan660
我这边写的有
是纯命令行交互的么?我不需要带用户界面的,因为我有。而且带用户界面的写的代码不好理解,抓不住核心要点,我知道需要有个用户链表来存储socket,而且服务端需要建立多个点对点的socket
package com.qq.server.
import java.util.*;public class ManageClientThread {
public static HashMap hm=new HashMap();
//向hm中添加一个客户端通讯线程
public static
void addClientThread(String uid,SerConClientThread ct)
hm.put(uid, ct);
public static SerConClientThread getClientThread(String uid)
return (SerConClientThread)hm.get(uid);
//返回当前在线的人的情况
public static String getAllOnLineUserid()
//使用迭代器完成
Iterator it=hm.keySet().iterator();
String res="";
while(it.hasNext())
res+=it.next().toString()+" ";
能直接发送全套的代码我么?
只需要多个客户端能在命令行界面下相互聊天就行
知道好像最高200分,帮我解决了,我追加200分
为您推荐:
扫描下载二维码<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&编程开发子分类}

我要回帖

更多关于 tcp客户端断网 服务端 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信