win7开机死机就死机 显示360Desktoplite64.exe_损坏文件怎么解决 求大神

3096人阅读
linux(4)
go语言是一个系统级语言,好处非常多。虽然是一个静态编译型语言,但可以像动态语言一样写程序,语言本身可以提供编写应用程序所需的基本组件,而不用引入第三方的包。如果了解c++、java、python等,会对其简洁和强大有更深的认识,c++实在过于繁琐,java也没有想象的简单,python的效率和go不是一个数量级的。那么多的特性,印象最深的就是其对并发的支持,优雅而高效。一般情况下并发通过进程、线程、基于异步IO的回调来实现,进程和线程不能大量的创建,如超过1万个系统资源就不堪重负了,回调可以尽可能少的创建线程,但用法不太符合自然习惯,比如boost
的asio就是一个很好的处理并发的框架,使用得当可以写出高效优雅的服务器程序。而go则在语言级别支持协程,协程是一种轻量级线程,可以创建百万个而不会耗尽系统的资源。仅举一简单例子,go语言写的服务器程序会解析来自Java的json格式的数据,修改后返回:
package main
&&&&&&& &fmt&
&&&&&&& &net&
&&&&&&& &encoding/json&
type Person struct{
&&&&&&& Name string
&&&&&&& Id&& int
&&&&&&& Lks []string
func doServerStuff(conn net.Conn){
&&&&&&& remote:=conn.RemoteAddr().String()
& & & &fmt.Println(remote,& connected!&)
&&&&&&& for {
&&&&&&&&&&&&&&& buf:=make([]byte,512)
& & & & & & & &size,err:=conn.Read(buf)
&&&&&&&&&&&&&&& if err!=nil{
&&&&&&&&&&&&&&&&&&&&&&& fmt.Println(&Read Error:&,err.Error());
& & & & & & & & & & & &&return
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& //fmt.Println(&data from client:&,string(buf),&size:&,size)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &
& & & & & & &var person Person
& & & & & & &err=json.Unmarshal(buf[:size],&person)
& & & & & &&if err!=nil{
&&&&&&&&&&&&&&&&&&&&&&& fmt.Println(&Unmarshal Error:&,err.Error());
& & & & & & & & & & & &&return
&& &&&&&&&& }
& & & & & & fmt.Println(&Person after Unmarshal:&,person)
& & & & & &&person.Id+=2
& & & & & &buf,err=json.Marshal(person)
& & & & &&&if err!=nil{
&&&&&&&&&&&&&&&&&&&&&&& fmt.Println(&Marshal Error:&,err.Error());
& & & & & & & & & & & &return
& & & & &&conn.Write(buf)
& & & & &conn.Close()
& & & & &break
func main(){
& & fmt.Println(&Starting the server...&)
&& &listener,err:=net.Listen(&tcp&,&0.0.0.0:50000&)
&& &if err!=nil{
&& &&& &fmt.Println(&Listen Error:&,err.Error())
&&&&&&&&&&&&&&& return
&&&&&&&&&&&&&&& conn,err:=listener.Accept()
& & & & & & & &&if err!=nil{
& & & & & & & & & & & &&fmt.Println(&Accept Error:&,err.Error())
&&&&&&&&&&&&&&&&&&&&&&& return
&& &&& &go doServerStuff(conn)
通过关键字go即可完成并发的处理&,go语言的哲学就是引入尽可能少的关键字和特性,编写最少的代码完成更多的功能,并且还提供了很好的工程管理和单元测试,一个go命令搞定一切,不需要任何类似Makefile或build.xml或pom.xml(maven使用的)&之类的项目文件。因此go语言的作者们认为,c++没什么好学的,值得学习的是c语言。
上面的代码中需要注意的是:
1.struct的变量名要大写
2.收到 socket的包之后要进行json解码,需传入实际的数据长度,如json.Unmarshal(buf[:size],&person)
Java代码:
import java.net.*;
import java.io.*;
import net.sf.json.JSONO
public class JSonTest {
&& & * @param args
&& &private static S
&& &private static BufferedR
&& &private static PrintW
&& &public static void main(String[] args) {
&& &&& &// TODO Auto-generated method stub
&& &&& &JSONObject jsonObj=new JSONObject();
&& &&& &jsonObj.put(&Name&,&liangyongs&);
&& &&& &jsonObj.put(&Id&, 31);
&& &&& &String[] likes={&java&,&golang&,&clang&};
&& &&& &jsonObj.put(&Lks&, likes);
&& &&& &System.out.println(&Object before sending to golang side:&);
&& &&& &System.out.println(jsonObj);
&& &&& &try{
&& &&& &&& &socket=new Socket(&127.0.0.1&,50000);
&& &&& &&& &in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
&& &&& &&& &out=new PrintWriter(socket.getOutputStream(),true);
&& &&& &&& &out.println(jsonObj);
&& &&& &&& &String line=in.readLine();
&& &&& &&& &System.out.println(&Object read from golang side:&);
&&&&&& & && jsonObj=JSONObject.fromObject(line);
&&&&&& &&& &System.out.println(jsonObj.get(&Id&));&
&&&&&& &&& &socket.close();
&& &&& &catch(IOException e){
&& &&& &&& &System.out.println(e);
这样可以传递任意数据,即使go语言一方,不按照Java传递的数据格式定义结构体,也可以解析出部分能对应出的字段,方便而简单。
go语言可以使用gdb调试,也可以直接嵌套C语言,所以不用担心支持go的库少,c语言可以搞定就行了,而且c的数据类型可以很容易的转换成go的数据类型,go也支持指针,支持goto,不久的将来可以在编译器级别支持多核编程。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5999次
排名:千里之外
(1)(2)(1)(1)(1)主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
认真你就赢了
分享大数据技术干货,让新人少走弯路少掉坑!
QQ: 备注你的CSDN博客地址~
学习编程,改变世界使用 Golang 写一个 WebSocket 服务器 - 简书
使用 Golang 写一个 WebSocket 服务器
没办法,标题就注定了这必定是一篇软文,因为即使是一个 WebSocket 的 Echo Server 也不是三言片语就可以讲完的,毕竟协议都满满有几页的内容。
本来是想从头到尾写记录如何写一个 WebSocket 服务器的,但是写了一点之后发现,这不就是协议本身的结构嘛,况且协议本身的组织已经非常规范,如果我再转述一遍的话难免会有纰漏、带人入沟。
不过好在我还是把代码写出来了,并放在了我的基Hub上:
下面就是一张运行的截图,在浏览器中和我的 WebSocekt 的 Echo Server 通信:
当然不会止步,我还会继续完善自己的轮子的,比如做一个 Chat Room,多跑一些测试(比如 )。
最后,如果你也想动手造一个轮子的话,推荐先通读下,这样的话才会有的放矢,阅读别人的代码时也会有一个脉络。附上官方的实现
其实这里还是有一个总结的,不然泛泛的让人不知所以。想造轮子的朋友:
动手写,可参考代码(官方的或者我的)
祝你成功!
/mconintet第一次跑到互联网公司实习 。。感觉自己进步飞快啊~第一周刚写了个HTTP服务器用于微信公共号的点餐系统~ 第二周就直接开始一边自学GO语言一边写用于Socket的服务器了。。。因为发现Golang这一块资料挺少的,接下来我会在Blog里把整个Server的Coding,还有遇到的坑都记录下来~在golang中,网络协议已经被封装的非常完好了,想要写一个Socket的Server,我们并不用像其他语言那样需要为socket、bind、listen、receive等一系列操作头疼,只要使用Golang中自带的net包即可很方便的完成连接等操作~在这里,给出一个最最基础的基于Socket的Server的写法:package mainimport ("fmt""net""log""os")func main() {//建立socket,监听端口netListen, err := net.Listen("tcp", "localhost:1024")CheckError(err)defer netListen.Close()Log("Waiting for clients")for {conn, err := netListen.Accept()if err != nil {continue}Log(conn.RemoteAddr().String(), " tcp connect success")handleConnection(conn)}}//处理连接func handleConnection(conn net.Conn) {buffer := make([]byte, 2048)for {n, err := conn.Read(buffer)if err != nil {Log(conn.RemoteAddr().String(), " connection error: ", err)return}Log(conn.RemoteAddr().String(), "receive data string:/n", string(buffer[:n]))}}func Log(v ...interface{}) {log.Println(v...)}func CheckError(err error) {if err != nil {fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())os.Exit(1)}}唔,抛除Go语言里面10行代码有5行error的蛋疼之处,你可以看到,Server想要建立并接受一个Socket,其核心流程就是netListen, err := net.Listen("tcp", "localhost:1024")conn, err := netListen.Accept()n, err := conn.Read(buffer)这三步,通过Listen、Accept 和Read,我们就成功的绑定了一个端口,并能够读取从该端口传来的内容~Server写好之后,接下来就是Client方面啦,我手写一个HelloWorld给大家:package mainimport ("fmt""net""os")func sender(conn net.Conn) {words := "hello world!"conn.Write([]byte(words))fmt.Println("send over")}func main() {server := "127.0.0.1:1024"tcpAddr, err := net.ResolveTCPAddr("tcp4", server)if err != nil {fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())os.Exit(1)}conn, err := net.DialTCP("tcp", nil, tcpAddr)if err != nil {fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())os.Exit(1)}fmt.Println("connect success")sender(conn)}可以看到,Client这里的关键在于tcpAddr, err := net.ResolveTCPAddr("tcp4", server)conn, err := net.DialTCP("tcp", nil, tcpAddr)这两步,主要是负责解析端口和连接~写好Server和Client之后,让我们运行一下看看:~~成功运行,Console出现Server等待连接的提示:然后我们运行Client:成功连接Server啦,让我们看看Server那边的成果:Server端成功的收到了我们的Hello-World啦,至于后面的那行红字,则是断开连接的提示~到这里,一个最基础的使用Socket的Server-Client框架就出来啦~如果想要让Server能够响应来自不同Client的请求,我们只要在Server端的代码的main入口中,在 handleConnection(conn net.Conn) 这句代码的前面加上一个 go,就可以让服务器并发处理不同的Client发来的请求啦关于Golang的并发处理,可以参考这里 Golang并行计算下一篇,我会写一下如何在Server和Client中设计一个通讯协议,从而达到自己的一些特殊要求~
版权声明:本文为博主原创文章,未经博主允许不得转载。
Linux-学习笔记(PHP向)&一&
最新教程周点击榜
微信扫一扫

我要回帖

更多关于 win7一开机就死机 的文章

 

随机推荐