首页 / GO / Golang socket
Golang socket
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Golang socket,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2737字,纯文字阅读大概需要4分钟。
内容图文
![Golang socket](/upload/InfoBanner/zyjiaocheng/1110/337d911be366404cbbc2fc52b78aeeda.jpg)
1.本例子实现了一个简单的TCP echo。客户端发送Hello,服务端回应World。
参考:《Socket编程》
2.服务端代码
package main
import (
"
net
"
"
fmt
"
"
os
"
"
time
"
)
//
错误处理函数
func checkErr(err error, extra string) bool {
if err != nil {
formatStr := " Err : %s\n";
if extra != "" {
formatStr = extra + formatStr;
}
fmt.Fprintf(os.Stderr, formatStr, err.Error());
returntrue;
}
returnfalse;
}
//连接处理函数func svrConnHandler(conn net.Conn) {
fmt.Println("Client connect success :", conn.RemoteAddr().String());
conn.SetReadDeadline(time.Now().Add(2 * time.Minute))
request := make([]byte, 128);
defer conn.Close();
for {
readLen, err := conn.Read(request)
if checkErr(err, "Read") {
break;
}
//socket被关闭了if readLen == 0 {
fmt.Println("Client connection close!");
break;
} else {
//输出接收到的信息
fmt.Println(string(request[:readLen]))
time.Sleep(time.Second);
//发送
conn.Write([]byte("World !"));
}
request = make([]byte, 128);
}
}
func main() {
//解析地址
tcpAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:6666");
if checkErr(err, "ResolveTCPAddr") {
return;
}
//设置监听地址
listener, err := net.ListenTCP("tcp", tcpAddr);
if checkErr(err, "ListenTCP") {
return;
}
for {
//监听
fmt.Println("Start wait for client.")
conn, err := listener.Accept();
if checkErr(err, "Accept") {
continue;
}
//消息处理函数 go svrConnHandler(conn);
}
}
3.客户端代码
package main
import (
"
fmt
"
"
os
"
"
net
"
"
sync
"
)
var gLocker sync.Mutex; //全局锁var gCondition *sync.Cond; //全局条件变量
//错误处理函数
func checkErr(err error, extra string) bool {
if err != nil {
formatStr := " Err : %s\n";
if extra != "" {
formatStr = extra + formatStr;
}
fmt.Fprintf(os.Stderr, formatStr, err.Error());
returntrue;
}
returnfalse;
}
//连接处理函数func clientConnHandler(conn net.Conn) {
gLocker.Lock();
defer gLocker.Unlock();
defer conn.Close();
request := make([]byte, 128);
for {
readLen, err := conn.Read(request)
if checkErr(err, "Read") {
gCondition.Signal();
break;
}
//socket被关闭了if readLen == 0 {
fmt.Println("Server connection close!");
//条件变量同步通知 gCondition.Signal();
break;
} else {
//输出接收到的信息
fmt.Println(string(request[:readLen]))
//发送
conn.Write([]byte("Hello !"));
}
request = make([]byte, 128);
}
}
func main() {
//解析地址
tcpAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:6666");
if checkErr(err, "ResolveTCPAddr") {
return;
}
conn, err := net.DialTCP("tcp", nil, tcpAddr);
if checkErr(err, "DialTCP") {
return;
}
fmt.Println("Connect server success.")
gLocker.Lock();
gCondition = sync.NewCond(&gLocker);
//发送数据给服务器
conn.Write([]byte("Hello !"));
//处理连接(lock在上面调用了,所以clientConnHandler函数必须等wait函数调用后才能lock,这样就能保证调用的先后顺序) go clientConnHandler(conn);
//主线程阻塞,等待Singal结束for {
//条件变量同步等待 gCondition.Wait();
break;
}
gLocker.Unlock();
fmt.Println("Client finish.")
}
4.结果截图
以上。
原文:http://www.cnblogs.com/chevin/p/8082224.html
内容总结
以上是互联网集市为您收集整理的Golang socket全部内容,希望文章能够帮你解决Golang socket所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。