TCP UDP基本编程(一)
tcp udp均可以用来网络通信,在使用之前建议先搜索一下相关网络连接的基本知识,可以更好的理解和使用,tcp建议看下如下文章:https://blog.csdn.net/chuangsun/article/details/67640242,建议多搜一下多看看。
直接上正文。。。。。。。。。。。。。。。
(1)socket类
采用socket类,使用最基本的同步方法。
tcp服务端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading; namespace net
{
class Program
{
static void Main(string[] args)
{
string host = "127.0.0.1";
IPAddress ip = IPAddress.Parse(host); //定义侦听端口
//IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 8889);
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, );
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(ipEnd);
socket.Listen();
Console.Write("Waiting for a client\r\n"); //一旦接受连接,创建一个客户端
Socket client = socket.Accept();
IPEndPoint ipEndClient = (IPEndPoint)client.RemoteEndPoint;
Console.Write("已连接:IP: {0} 端口: {1}\r\n", ipEndClient.Address, ipEndClient.Port); while(true)
{
//接收数据
byte[] recv1 = new byte[];
int count1 = client.Receive(recv1);
string str = Encoding.ASCII.GetString(recv1, , count1);
Console.WriteLine("Client:" + Encoding.ASCII.GetString(recv1, , count1)); if(str=="exit")
{
break;
} //发送数据
string welcome = "Server received:"+ str;
byte[] data = new byte[];
data = Encoding.ASCII.GetBytes(welcome);
client.Send(data, data.Length, SocketFlags.None);
} Thread.Sleep();
Console.Write("\r\n断开连接: {0}", ipEndClient.Address);
client.Close();
socket.Close();
Console.ReadKey();
}
}
}
tcp客户端
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Text;
using System.Threading; namespace client
{
class Program
{
static void Main(string[] args)
{
//定义主机的IP及端口
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ipEnd = new IPEndPoint(ip, );
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipEnd); while(true)
{
//发送数据
string msg = Console.ReadLine();
byte[] msgBytes = new byte[];
msgBytes = Encoding.ASCII.GetBytes(msg);
socket.Send(msgBytes, msgBytes.Length, SocketFlags.None); //接收数据
byte[] recvMsg = new byte[];
int count = socket.Receive(recvMsg);
string recvStr = Encoding.ASCII.GetString(recvMsg, , count);
Console.WriteLine(recvStr); if(msg=="exit")
{
break;
}
} Thread.Sleep();
Console.Write("断开连接");
socket.Shutdown(SocketShutdown.Both);
socket.Close();
Console.ReadKey();
} }
}
udp服务端:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets; namespace UDP
{
class Program
{
static void Main(string[] args)
{
int recv;
byte[] data = new byte[]; IPEndPoint ip = new IPEndPoint(IPAddress.Any, );
Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Server.Bind(ip);
Console.WriteLine("Server ready!"); //得到客户机IP
//IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
//EndPoint Remote = (EndPoint)(sender);
//recv = Server.ReceiveFrom(data, ref Remote);
//Console.Write("Message from "+Remote.ToString()+":");
//Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); ////客户机连接成功后,发送信息
//string welcome = "Hello ! ";
//data = Encoding.ASCII.GetBytes(welcome);
//Server.SendTo(data, data.Length, SocketFlags.None, Remote); while(true)
{
//得到客户机IP
IPEndPoint sender = new IPEndPoint(IPAddress.Any, );
EndPoint Remote =sender;
recv = Server.ReceiveFrom(data, ref Remote);
string recvStr = Encoding.ASCII.GetString(data, , recv);
Console.Write("Message from " + Remote.ToString() + ":");
Console.WriteLine(recvStr); //客户机连接成功后,发送信息
string welcome = "Server received: "+ recvStr;
data = Encoding.ASCII.GetBytes(welcome);
Server.SendTo(data, data.Length, SocketFlags.None, Remote);
}
//while (true)
//{
// data = new byte[1024];
// //发送接收信息
// recv = Server.ReceiveFrom(data, ref Remote);
// Console.Write("Message from " + Remote.ToString() + ":");
// Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); // if (Encoding.ASCII.GetString(data, 0, recv) == "exit")
// break; // Server.SendTo(data, recv, SocketFlags.None, Remote);
//}
//Console.WriteLine("停止");
Server.Close();
Console.ReadKey();
}
}
}
udp客户端:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets; namespace UDPClient
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[];
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.8.15"), );
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Console.WriteLine("Client ready:"); //string welcome = "Server hello!";
//data = Encoding.ASCII.GetBytes(welcome);
//server.SendTo(data, data.Length, SocketFlags.None, ip); //IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
//EndPoint Remote = (EndPoint)sender;
//data = new byte[1024];
//int recv = server.ReceiveFrom(data, ref Remote);
//Console.Write("Message from "+Remote.ToString()+":");
//Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); while(true)
{
string welcome = Console.ReadLine();
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ip); IPEndPoint sender = new IPEndPoint(IPAddress.Any, );
EndPoint Remote = sender;
data = new byte[];
int recv = server.ReceiveFrom(data, ref Remote);
Console.Write("Message from " + Remote.ToString() + ":");
Console.WriteLine(Encoding.ASCII.GetString(data, , recv));
}
//while (true)
//{
// input = Console.ReadLine();
// server.SendTo(Encoding.ASCII.GetBytes(input), Remote); // if (input == "exit")
// break; // data = new byte[1024];
// recv = server.ReceiveFrom(data, ref Remote);
// stringData = Encoding.ASCII.GetString(data, 0, recv);
// Console.Write("Message from " + Remote.ToString() + ":");
// Console.WriteLine(stringData);
//}
Console.WriteLine("停止");
server.Close();
Console.ReadKey();
}
}
}
(2)TcpClient UdpClient TcpListener类
上述连个类为.NET自封装两个类。
tcp服务端:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text; namespace TcpServerT
{
class Program
{
static void Main(string[] args)
{
//IPAddress IP = IPAddress.Parse("127.0.0.1");
TcpListener listener = new TcpListener(IPAddress.Any, );
listener.Start();
Console.WriteLine("开始监听:"); //此处也可以采用socket 接收,可以方便进行socket操作
//Socket s = listener.AcceptSocket();
TcpClient client = listener.AcceptTcpClient();//接受一个Client
Console.WriteLine("已连接:");
NetworkStream stream = client.GetStream();//获取网络流
Console.WriteLine("获取连接流:");
string receiveString = ""; while (true)
{
byte[] buffer = new byte[client.ReceiveBufferSize];
stream.Read(buffer, , buffer.Length);//读取网络流中的数据
receiveString = Encoding.Default.GetString(buffer).Trim('\0');//转换成字符串
//StreamReader sr = new StreamReader(stream);
//receiveString = sr.ReadToEnd(); string sendMsg = "Server received:" + receiveString;
byte[] sendBytes = Encoding.Default.GetBytes(sendMsg);
stream.Write(sendBytes, , sendBytes.Length);
stream.Flush(); Console.WriteLine(receiveString);
//Console.WriteLine("While++");
if (receiveString == "exit")
{
stream.Close();//关闭流
client.Close();//关闭Client
break;
}
}
listener.Stop();
}
}
}
tcp客户端:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text; namespace TcpClientT
{
class Program
{
static void Main(string[] args)
{
//IPAddress IP = IPAddress.Parse("192.168.8.15");
//IPEndPoint ip = new IPEndPoint(IP, 1234);
//TcpClient client = new TcpClient("192.168.8.15",1234);
IPEndPoint ip = new IPEndPoint(IPAddress.Any, );
TcpClient client = new TcpClient("127.0.0.1", ); NetworkStream sendStream = client.GetStream(); while (true)
{
string msg = Console.ReadLine();
Byte[] sendBytes = Encoding.Default.GetBytes(msg);
sendStream.Write(sendBytes, , sendBytes.Length);
sendStream.Flush();
//StreamWriter sw = new StreamWriter(sendStream);
//sw.WriteLine(msg);
//sw.Flush(); byte[] buffer = new byte[client.ReceiveBufferSize];
sendStream.Read(buffer, , buffer.Length);//读取网络流中的数据
string receiveMsg = Encoding.Default.GetString(buffer).Trim('\0');//转换成字符串 Console.WriteLine(receiveMsg); if (msg == "exit")
{
sendStream.Close();//关闭网络流
break;
}
}
client.Close();//关闭客户端
}
}
}
udp服务端
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text; namespace UdpServer
{
class Program
{
static void Main(string[] args)
{
UdpClient udpServer = new UdpClient(); while (true)
{
var remoteEP = new IPEndPoint(IPAddress.Any, );
byte[] recvData = udpServer.Receive(ref remoteEP); // listen on port 11000
string recvString = Encoding.Default.GetString(recvData);
Console.Write("Source from" + remoteEP.ToString()+":"+ recvString); if(recvString=="exit")
{
break;
} string sendString = "Server received:" + recvString;
byte[] sendData = Encoding.Default.GetBytes(sendString);
udpServer.Send(sendData, sendData.Length, remoteEP); // reply back
}
udpServer.Close();
}
}
}
udp客户端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text; namespace UdpClientT
{
class Program
{
static void Main(string[] args)
{
UdpClient client = new UdpClient();
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), ); // endpoint where server is listening
client.Connect(ep); while(true)
{
string sendString = Console.ReadLine();
byte[] sendData = Encoding.Default.GetBytes(sendString);
client.Send(sendData, sendData.Length); byte[] recvData = client.Receive(ref ep);
string recvString = Encoding.Default.GetString(recvData);
Console.WriteLine(recvString); if (sendString == "exit") break;
}
client.Close();
}
}
}
PS:最基本的同步方法为阻塞线程模式,即在接受消息或者服务端等待连接过程中,主程序在此位置属于阻塞(卡住)状态,只有这一步执行完毕(收到消息或者建立连接)才会进行下一步。所以可以通过死循环来实现循环接受消息。
udp不存在严格意义上的客户端服务端,只是要确定消息发送的目标主机
如 Socket client = socket.Accept();
int count1 = client.Receive(recv1);
TCP UDP基本编程(一)的更多相关文章
- 三十天学不会TCP,UDP/IP编程--MAC地址和数据链路层
这篇文章主要是来做(da)推(guang)介(gao)的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,后面会 ...
- Go语言TCP/UDP Socket编程
1. TCP编程 TCPClient // TCPClient project main.go package main import ( "fmt" "net" ...
- tcp/udp socket编程异同
一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UDP不保证 ...
- TCP/UDP网络编程的基础知识与基本示例(windows和Linux)
一.TCP编程的一般步骤 服务器端: 1.创建一个socket,用函数socket() 2.绑定IP地址.端口等信息到socket上,用函数bind() 3.开启监听,用函数listen() 4.接收 ...
- Java中的TCP/UDP网络通信编程
127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...
- Java TCP/UDP网络通信编程
本文转自:http://www.cnblogs.com/cdtarena/archive/2013/04/10/3012282.html 网络应用中基本上都是TCP(Transmission Cont ...
- 自测之Lesson15:TCP&UDP网络编程
题目:编写一个TCP通信的程序. 实现代码: #include <stdio.h> #include <sys/socket.h> #include <unistd.h& ...
- tcp udp socket编程
http://blog.csdn.net/ns_code/article/details/14128987
- 三十天学不会TCP,UDP/IP网络编程-IP头格式祥述
我又来了,这篇文章还是来做(da)推(guang)介(gao)我自己的!俗话说事不过三,我觉得我下次得换个说法了,不然估计要被厌恶了,但是我是好心呐,一定要相信我纯洁的眼神.由于这两年接触到了比较多的 ...
随机推荐
- javaweb技术入门
JavaWeb巩固和进阶 1.如何配置外部应用? 方法一: server.xml 在<Host>中添加如下配置 <Context path="/xxx" docB ...
- EL十一大内置对象
这是一个内置对象可以直接拿来使用,不需要再去声明. 1.读取页面上下文: (1)pageContext对象: 获取URL和URI: <body> URI:${pageContext.req ...
- windows下 python 如何安装pygame模块
本机系统:win7,Pyhon版本: 3.6.0 1. 安装下载python官网 https://www.python.org/ 下载地址 https://www.python.org/downloa ...
- FTP协议的主动模式和被动模式的区别
最近准备做一个<FtpCopy系列教程>,主要讲解Ftp协议主动模式和被动模式的区别.以及FTP服务器的安装部署,然后通过几个常用实例演示,详细讲解如何使用FtpCopy进行数据自动备份. ...
- 校园网 虚拟机VMware Linux桥接模式 无法上网 问题
只是解决常见虚拟机桥接模式 无法上网问题,基本的百度都有 基本知识 虚拟机有三种网络连接模式:桥接模式,net模式,仅主机 桥接模式:同一网段允许的话,相当于一个独立的物理主机,独立ip net模式: ...
- 快学Scala 第二十课 (trait的构造顺序)
trait的构造顺序: 首先调用超类构造器 特质构造器在超类构造器之后,类构造器之前执行 特质从左向右被构造 每个特质当中,父特质先被构造 如果多个特质共有一个父特质,而那个父特质已经被构造,则不会被 ...
- 后端开发实践系列之四——简单可用的CQRS编码实践
本文只讲了一件事情:软件模型中存在读模型和写模型之分,CQRS便为此而生. 20多年前,Bertrand Meyer在他的<Object-Oriented Software Constructi ...
- 设置Activity全屏的方法:
1)代码隐藏ActionBar 在Activity的onCreate方法中调用getActionBar.hide();即可 2)通过requestWindowFeature设置 requestWind ...
- 浅谈分布式事务与TX-LCN
最近做项目使用到了分布式事务,下面这篇文章将给大家介绍一下对分布式事务的一些见解,并讲解分布式事务处理框架TX-LCN的执行原理,初学入门,错误之处望各位不吝指正. 什么情况下需要使用分布式事务? 使 ...
- java动手动脑和动手实验
动手动脑一: EnumTest.java: 程序代码: public class EnumTest { public static void main(String[] args) { Size s= ...