精华内容
下载资源
问答
  • TCP 客户端

    2018-02-27 15:54:18
    用VC++编写的TCP客户端,支持TCP/IP协议,采用TCP连接方式进行数据接收
  • 同步TCP客户端

    2018-10-24 10:11:48
    同步TCP客户端工程,代码有详解,适合新手学习,实现实时数据通信
  • MagicSocketDebugger:套接字调试工具,TCP服务器,TCP客户端,websocket服务器,websocket客户端,心跳包(基于qt5.9)----套接字调试工具,TCP服务端,TCP客户端,WebSocket服务端,WebSocket客户端,心跳包(基于...
  • Qt TCP客户端

    2018-07-16 18:50:49
    Qt 写的TCP客户端程序,在线程中完成数据收发,使用协议解析接口解析数据可以比较容易的更换通信协议。
  • C#ModbusTCP客户端

    2018-03-06 15:47:32
    C#ModbusTCP客户端,配合PLC测试OK,绝对可以用ModbusTCP客户端,下载绝对不吃亏,C#源代码!
  • TCP客户端测试工具

    热门讨论 2010-03-15 22:21:15
    TCP客户端测试工具 TCP客户端测试工具 TCP客户端测试工具 TCP客户端测试工具 TCP客户端测试工具
  • Python tcp编程,TCP服务端和TCP客户端代码编写.pdf
  • C# TCP 客户端源码实现

    2020-08-14 16:51:52
    C# TCP 客户端源码实现。
  • C语言编写TCP客户端

    2017-03-23 20:18:31
    网络编程通过C语言实现TCP客户端的编写
  • 主要介绍了Android编程实现TCP客户端的方法,结合实例形式分析了Android实现TCP客户端的原理及数据通信的相关技巧,需要的朋友可以参考下
  • tcp客户端服务器发送源码
  • 语言:C#,功能:简易TCP客户端和TCP服务端。实现客户端与服务端的通信。实测:将服务端放在服务器上,客户端放在本地,通信正常。
  • C#编写TCP客户端应用程序
  • C#简单的TCP客户端

    2018-10-30 16:52:50
    非常简单的TCP客户端,用的是C#来写的,非常适合新手参考学习
  • C++控制台 TCP客户端

    2014-12-06 00:46:18
    C++控制台 TCP客户端 自己用过的 不是MFC的
  • tcp客户端程序代码

    2016-01-01 19:17:23
    tcp客户端程序源代码 vc++软件开发案例
  • TCP客户端服务端

    2012-05-17 20:10:09
    包括两个MFC程序, 一个TCP服务端,支持消息头、自动回复; 一个TCP客户端,支持消息头,自动发送。 可用于开发时模拟TCP通信对端。
  • 基于我们开源的Modbus协议栈实现的Modbus TCP客户端和服务器示例,使用VS2019开发。
  • 主要介绍了Android实现TCP客户端接收数据的方法,较为详细的分析了Android基于TCP实现客户端接收数据的相关技巧与注意事项,需要的朋友可以参考下
  • MFC 网络通信 TCP 客户端
  • C#编写Modbus TCP客户端程序

    千次下载 热门讨论 2016-08-27 17:41:24
    用C#写的一个Modbus TCP客户端程序,配合博文 http://blog.csdn.net/thebestleo/article/details/52331976 学习
  • c++tcp客户端,很简单的一个客户端,接受并返回一串字符串,最主要是中文注释,我真是个好人分享给大家了
  • Android 一步步实现TCP客户端

    万次阅读 多人点赞 2018-08-31 23:04:05
    使用这一行代码就能建立一个TCP客户端,并能成功连接服务器 所以,剧终! 哈哈哈!!! 好了,不开玩笑了,下面具体一步一步来: 上面说到使用一句话就能创建一个TCP客户端,并建立与服务器的连接,其实是真的...

    开门见山

    socket = new Socket("211.159.189.50", 2029);

    使用这一行代码就能建立一个TCP客户端,并能成功连接服务器

    所以,剧终!

    哈哈哈!!!

     

    好了,不开玩笑了,下面具体一步一步来:

    上面说到使用一句话就能创建一个TCP客户端,并建立与服务器的连接,其实是真的,

    不过能成功运行这句话还需要做点辅助工作

    辅助工作1:

    从Android4.0以后,就不支持在主线程中直接初始化socket了

    既然不支持在主线程中直接初始化,那我们能怎么办呢?只能创建子线程呗。

    ConnectThread.java

    package com.example.test2;
    
    import java.io.IOException;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class ConnectThread extends Thread{
    	Socket socket = null;		//定义socket
    	public void run(){
            System.out.println(Thread.currentThread().getName()+": Hello");
            try {
    			socket = new Socket("211.159.189.50", 2029);
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    }

    在eclipse中新建一个类,并继承Thread类,覆写run方法。那么在new一个ConnectThread 实例的时候,就相当于创建了一个线程,我们在线程中写入我们一直想实现的那句话 socket = new Socket("211.159.189.50", 2029);

    然后在MainActivity.java中创建并启动上述线程

    MainActivity.java

    package com.example.test2;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class MainActivity extends Activity {
    
    	ConnectThread ct;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		ct = new ConnectThread();
    		ct.start();
    	}
    }
    

    运行,看到服务器端已有一个设备连接进来,说明Android TCP客户端创建成功

    [root@VM_0_14_centos tcp]# ./server2.out 
    ...connection from host 183.194.175.168,port 16009,socket 4
    ...


    辅助工作2:

    因为涉及到联网操作,需要添加网络访问权限,具体自行Google

     

    辅助工作3:

    光连上有什么用,发个数据啊! 好,下面就向服务器发送数据

    起码的样子有一下

    相应的两份Java代码更新一下

    ConnectThread.java

    package com.example.test2;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class ConnectThread extends Thread{
    	Socket socket = null;		//定义socket
    	OutputStream outputStream = null;	//定义输出流(发送)
    	public void run(){
            System.out.println(Thread.currentThread().getName()+": Hello");
            try {
    			socket = new Socket("211.159.189.50", 2029);
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
            
            //获取输出流
    		try {
    			outputStream = socket.getOutputStream();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    }
    

    MainActivity.java

    package com.example.test2;
    
    import java.io.IOException;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    
    public class MainActivity extends Activity {
    
    	Button b1;
    	EditText sendET;
    	
    	ConnectThread ct;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		ct = new ConnectThread();
    		ct.start();
    		
    		b1 = (Button)findViewById(R.id.button1);
    		sendET = (EditText)findViewById(R.id.editText1);
    		
    		
    		b1.setOnClickListener(new OnClickListener() {
    			public void onClick(View v) {
    				//发送数据
    				try {
    					ct.outputStream.write(sendET.getText().toString().getBytes());
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    }
    

    辅助工作4:

    有发送还不够,还要有接收

    最简单的,开个新线程去接收

    好,子线程接收数据没问题,但是要在子线程中将数据显示在文本框中就不那么容易了

    很多人就纳闷了,数据我都接收到了,显示不就调用recvET.setText(buffer);就能显示到文本框了吗

    事实并非那么容易

    recvET.setText(buffer);这句话你是写在哪里的,是写在接收子线程中的;但是你要知道,在Android中,

    是不允许在子线程中进行UI操作的。这点和C#类似,C#中是怎么解决的呢,使用的是Invoke方法和委托代理机制。

    那么Android中又是怎样解决这个事情的呢?那就是用runOnUiThread()方法。runOnUiThread()方法的作用是将当前

    线程切换到主线程,然后进行UI操作。

    有了解决办法,我们就照着这个办法去做,runOnUiThread()方法是Activity类中的方法,要想使用此方法就必须

    继承Activity类,那么问题又来了,Java不像C++,是不允许直接多重继承的,在C++中一个类可以直接多重继承好几个类,

    如:

    class x:public A,public B,...
    {
        void foo(){printf("X");};
    }

    但是在Java中是不允许的,下面的写法是错误的

    class ConnectThread1 extends Thread Activity{

    ……

    }

    回到我们的Android的例程,我们想要在接收子线程中将接收到的消息显示在文本框中,那么就必须要继承两个类Thread

    和Activity,但是Java中又不允许直接多重继承,这就有点麻烦了,那能解决吗?肯定能啊。

    解决办法,使用内部类

    既然Java不允许直接多重继承,那么我们就间接的多重继承呗,怎么间接的多重继承呢,那就是使用内部类

    一睹为快,先看代码

    package com.example.test2;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    
    public class MainActivity extends Activity {
    
    	Button b1;
    	EditText sendET;
    	EditText recvET;
    	
    	ConnectThread ct;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		recvET = (EditText)findViewById(R.id.editText2);
    		ct = new ConnectThread();
    		ct.start();
    		
    		b1 = (Button)findViewById(R.id.button1);
    		sendET = (EditText)findViewById(R.id.editText1);
    		
    		
    		b1.setOnClickListener(new OnClickListener() {
    			public void onClick(View v) {
    				//发送数据
    				try {
    					ct.outputStream.write(sendET.getText().toString().getBytes());
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    	
    	
    	class ConnectThread extends Thread{
    		Socket socket = null;		//定义socket
    		OutputStream outputStream = null;	//定义输出流(发送)
    		InputStream inputStream=null;	//定义输入流(接收)
    		MainActivity ma;
    		public void run(){
    	        System.out.println(Thread.currentThread().getName()+": Hello");
    	        try {
    				socket = new Socket("211.159.189.50", 2029);
    			} catch (UnknownHostException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    	        
    	        //获取输出流
    			try {
    				outputStream = socket.getOutputStream();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    			try{
    				while (true) 
    				{
    					final byte[] buffer = new byte[1024];//创建接收缓冲区
    					inputStream = socket.getInputStream();
    					final int len = inputStream.read(buffer);//数据读出来,并且返回数据的长度
    					runOnUiThread(new Runnable()//不允许其他线程直接操作组件,用提供的此方法可以
    					{
    						public void run() 
    						{	
    							// TODO Auto-generated method stub
    							recvET.append(new String(buffer,0,len)+"\r\n");	
    						}	
    					});	
    				}
    			}
    			catch (IOException e) {
    				
    			}
    			
    		}
    	}
    
    }
    

    为了简单,我并没有再新建一个接收类,而是将接收直接写在了ConnectThread最后的死循环中。可以看出,内部类就是将之前的ConnectThread类直接剪贴到MainActivity类中,地位等同MainActivity类中成员方法和成员变量,我暂且将其称之为成员类。上述代码中,我们使用runOnUiThread()方法实现了对UI的操作,使得消息能够显示到UI。

    至此,一个简单的Android TCP客户端就实现了。


    下面是效果

    客户端:

    服务端:

    源码下载:https://download.csdn.net/download/lyndon_li/10639745

    链接:https://pan.baidu.com/s/1zR0ajh2WTMuOtJvs7ecMhg 
    提取码:toxt 

    展开全文
  • 在修改官方移植lwip的基础上,搭建tcp客户端,来进行数据的收发,硬件基础:stm32f407+lan9303
  • golang tcp 客户端

    千次阅读 2017-09-06 17:27:29
    最近找了网上tcp客户端的例子,都不是很好,特今天写一个tcp 客户端案例。 1.新建tcpclient结构体: type TcpClientModel struct { Conn net.Conn //发送chan SendChan chan []byte //心跳chan ...

    最近找了网上tcp客户端的例子,都不是很好,特今天写一个tcp 客户端案例。


    1.新建tcpclient结构体:

    type TcpClientModel struct {
           Conn net.Conn
           //发送chan
           SendChan chan []byte
           //心跳chan
           ClientPingChan chan int
           //停止chan
           StopChan        chan int
    }


    2. 链接服务器:

    //连接服务器
    func connectServers() {
           conn, err := net.Dial("tcp", "10.7.28.130:9998")
           if err != nil {
                  log.Println(err)
                  return
           }
           defer conn.Close()
           tcpClientM := &TcpClientModel{
                  Conn:            conn,
                  StopChan:        make(chan int, 1),
                  ClientPingChan:  make(chan int, 100),
                  SendChan:        make(chan []byte, 100),
           }
           tc0 = tcpClientM
           go tcpClientM.pingAndDataPacket()
           tcpClientM.receivePackets()
    }


    3.发送心跳和数据包接口

    //发送心跳和数据包
    func (tcpClient *TcpClientModel) pingAndDataPacket() {
           for {
                  select {
                  //数据发送统一接口
                  case data, _ := <-tcpClient.SendChan:
                         tcpClient.Conn.Write(data)
                         //定时发送心跳数据
                  case <-time.Tick(10 * time.Second):
                         tcpClient.sendHeartPacket()
                         //防止心跳发送chan
                  case <-tcpClient.ClientPingChan:
                  case <-tcpClient.StopChan:
                         goto stop
                  }
           }
    stop:
           log.Println("关闭连接")
    }
    func (tcpClient *TcpClientModel) sendHeartPacket() {
           //ping 包数据
           tcpClient.Conn.Write([]byte{})
    }


    4. 接受服务端数据并处理业务

    func (tcpClient *TcpClientModel) receivePackets() {
           defer func() {
                  log.Println("close tcpClient")
                  tcpClient.StopChan <- 1
                  tcpClient.Conn.Close()
                  if err := recover(); err != nil {
                         log.Println("readPacket", zap.Any("recover", err))
                         return
                  }
           }()
           //接受服务端数据并处理业务
           for {
                  message, err := proto.ReadPacket(tcpClient.Conn)
                  if err != nil {
                         log.Println("packet is get error", zap.Error(err))
                         goto LogOut
                  }
                  switch m := message.(type) {
                  case *proto.StreamPongPacket:
                         log.Println("业务处理, 可以新开携程去处理",m)
                  default:
                         log.Println("invalid messageReceived msg:", zap.Any("message", message))
                         goto LogOut
                  }
           }
    LogOut:
           log.Println("关闭链接")
    }

    5. 函数入口,数据发送

    func main() {
           go connectServers()
           time.Sleep(time.Second * 1)
    
           tc.SendChan <- []byte{1, 2, 1, 2}
           //tc.sendHeartPacket()
    
           time.Sleep(time.Second * 20)
           tc.SendChan <- []byte{1, 2, 1, 2}
           select {}
    
    }
    

    总结: 1.  message, err := proto.ReadPacket(tcpClient.Conn)  接受服务端数据有可以单独开携程去接受,并通过chan到业务处理方法

    2.退出 tcpclient的时候必须关闭pingAndDataPacket 携程

    3. 若有数据接受,且不往服务端回复数据的话,可以往ClientPingChan 发送信号,防止反复发送心跳数据

    4.  proto.ReadPacket(tcpClient.Conn)  数据处理  采用如下方式“var b = make([]byte, TCP_MAX_PACKET_SIZE)   _, err := conn.Read(b[:2])“


    展开全文
  • 好用的TCP 客户端服务器通讯以及modbus调试助手,非常方便。
  • 节点-tcp-客户端 具有重新连接的简单TCP客户端
  • Zynq-7000 PS部分Ethernet驱动(TCP客户端、UDP客户端),以及整个工程项目。开发环境:Vivado 18.2
  • TCP客户端服务器-Python3 使用Python3创建的TCP客户端和服务器
  • 基于QT5的TCP客户端

    2019-01-04 10:13:45
    基于Qt5的TCP客户端,可以收发中英文字符串,跨平台,有利于新手开发和理解tcp

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 631,024
精华内容 252,409
关键字:

tcp客户端